【问题标题】:Connecting Arduino Uno to PIC18F4620 using I2C使用 I2C 将 Arduino Uno 连接到 PIC18F4620
【发布时间】:2014-02-13 23:41:59
【问题描述】:

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

这段代码有什么问题??

提前致谢。

【问题讨论】:

    标签: arduino pic i2c


    【解决方案1】:

    好吧,首先我建议您购买逻辑分析仪,例如 logicopenbenchbuspiratearduino based one(或任何其他更昂贵的可以解释 @ 987654330@)。

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

    您应该测试几个参数:

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

    如果我所说的都不起作用,那么我想是时候从 i2c 的角度确定哪些设备是静音或失聪了……

    然后,尝试将您的两个板与另一个 i2c 设备一起使用。即,尝试通过使用 buspirate、i2c 加密狗或display connector 与您的计算机与 PIC 板通信,然后使用i2cdetect 来玩它。

    在另一端,尝试使用您的 Arduino 连接到任何类型的工业 i2c 组件。了解哪个不起作用将有助于您调查哪个不起作用或行为不端。

    最后,如果您对软件工程足够熟悉,我建议您使用 i2cdev library,它实际上在有缺陷的 Arduino 实现之上做了一个不错的抽象。

    HTH

    【讨论】:

      【解决方案2】:

      您是否已验证 PIC 会将序列发送到您的 PC?

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

      我知道早期版本的 MPLAB 有很好的调试模拟器来帮助查找代码问题。我相信 MPLABX 也是如此。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2022-12-31
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 2016-02-23
        相关资源
        最近更新 更多