使用I2C将Arduino Uno连接到PIC18F4620

时间:2014-02-13 23:42:00

标签: arduino pic i2c

我正在尝试使用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没有收到任何东西,

这段代码有什么问题?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您是否已确认PIC会将序列号发送到您的PC?

此外,您可以输入代码以在代码中的不同位置打开LED以进行故障排除。

我知道早期版本的MPLAB有很好的调试模拟器来帮助查找代码问题。我确信MPLABX也能做到。

您是否为PIC设置了配置位?我在你的代码中没有看到。

答案 1 :(得分:0)

嗯,首先我建议您使用逻辑分析仪,例如logicopenbenchbuspiratearduino based one(或任何其他更昂贵的选项,可以解释i2c)。

然后,你会看到是否没有电子问题。

您应该测试一些参数:

  • 两个组件之间是否存在线路连续性,许多i2c问题可能来自PCB上的故障电缆或坏迹线:
    • 使用测试仪,或者更好的是,在arduino上用于i2c的三个引脚上进行HIGH / LOW循环,看看你是否可以在PIC端读取它。
  • 你是否在两侧正确连接i2c?
    • 这可能看起来很愚蠢,但是狗屎发生了...... SDA 真的连接到SDASCL连接到SCL
  • 是两侧配置相同的i2c速度吗?
    • 默认情况下,arduino上的速度设置为100kHz(尽管双重检查twi.c文件)。您可以通过在之前将其设置为400kHz 来将此设置更改为更高的速度,包括Wire.h,即:#define TWI_FREQ 400000L
    • 我对PIC的一面知之甚少,但检查速度是否正确设置。
    • 使用逻辑分析仪,检查时钟线是否确实以广告值旋转。由于所有时钟都与AVR相关,有时您可能会期望给定的速度,但只能获得一半,因为保险丝设置错误或某些设置错误导致MCU的时钟速度降低(以及所有其他时钟)。 / LI>
  • 正如我所说,我对PIC不太了解,但你在PIC上使用的引脚是否能够应对i2c的速度?
    • 我知道在AVR上,有点撞击的i2c通信可能需要以较慢的速度完成。对PIC来说可能是这样吗?

如果我所说的都没有,那么我想是时候从i2c的角度确定哪些设备是静音还是聋......

然后,尝试将两块电路板与另一台i2c设备一起使用。即,尝试使用PIC板通过PIC板进行通信,方法是使用buspirate,i2c加密狗或display connector,然后使用i2cdetect进行播放。

另一方面,尝试使用Arduino连接到任何类型的工业i2c组件。知道那个不起作用的那个将帮助你调查哪一个不起作用或行为不端。

最后,如果你对软件工程很满意,我建议你使用i2cdev library,这实际上是在有缺陷的Arduino实现之上进行了一次不错的抽象。

HTH