我正在尝试使用I2C协议将Arduino Uno连接到PIC18F4620,
我为Arduino编写了这段代码
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
Wire.beginTransmission(0xA0);
Wire.write(2);
Wire.write('I');
Wire.write('2');
Wire.write('C');
Wire.write('\n');
Wire.endTransmission();
Serial.println("Send to I2C Slave 0xA0");
delay(1000);
}
和使用CCS编译器的PIC18F4620代码:
#include <slave.h>
#use rs232(stream=string,baud=9600, xmit=PIN_C6, rcv=PIN_C7,parity = N, bits = 8)
#define P_SDA PIN_C4
#define P_SCL PIN_C3
#use i2c(slave, sda=P_SDA, scl=P_SCL,address=0xA0)
void main()
{
char data;
char buffer_I2C[10];
int i=0;
printf("SLAVE\r\n");
while(TRUE)
{
if(i2c_poll())
{
data = i2c_read();
printf("%d \r\n" ,data);
if(data != -96)
{
if(data == '\n')
{
if(buffer_I2C[0] == 2)
{
buffer_I2C[i]='\0';
printf("Message - %s\r\n",buffer_I2C);
}
}
else
{
buffer_I2C[i]=data;
i++;
}
}
else
{
i=0;
}
}
}
}
问题是PIC没有响应Arduino,我的意思是当arduino向PIC发送数据时,PIC没有收到任何东西,
这段代码有什么问题?
提前致谢。
答案 0 :(得分:0)
您是否已确认PIC会将序列号发送到您的PC?
此外,您可以输入代码以在代码中的不同位置打开LED以进行故障排除。
我知道早期版本的MPLAB有很好的调试模拟器来帮助查找代码问题。我确信MPLABX也能做到。
您是否为PIC设置了配置位?我在你的代码中没有看到。
答案 1 :(得分:0)
嗯,首先我建议您使用逻辑分析仪,例如logic
或openbench
或buspirate
或arduino based one(或任何其他更昂贵的选项,可以解释i2c
)。
然后,你会看到是否没有电子问题。
您应该测试一些参数:
SDA
真的连接到SDA
,SCL
连接到SCL
?twi.c
文件)。您可以通过在之前将其设置为400kHz 来将此设置更改为更高的速度,包括Wire.h
,即:#define TWI_FREQ 400000L
如果我所说的都没有,那么我想是时候从i2c的角度确定哪些设备是静音还是聋......
然后,尝试将两块电路板与另一台i2c设备一起使用。即,尝试使用PIC板通过PIC板进行通信,方法是使用buspirate,i2c加密狗或display connector,然后使用i2cdetect
进行播放。
另一方面,尝试使用Arduino连接到任何类型的工业i2c组件。知道那个不起作用的那个将帮助你调查哪一个不起作用或行为不端。
最后,如果你对软件工程很满意,我建议你使用i2cdev
library,这实际上是在有缺陷的Arduino实现之上进行了一次不错的抽象。
HTH