Microchip
直播中

王玮

7年用户 274经验值
私信 关注
[问答]

I2C接近工作状态后没有我希望发送的字节该怎么办?

HARMony:1.09设备:PIC32MZ2048EFH064Harmony I2C配置:使用所有默认设置,参见附件。MPLAB:3.45MyI2C接口非常简单。一个PIC32主控器,连接到一个I2C从机。我一直很难让我的I2C功能。我一直在清除代码,直到我能够得到一些我可以观察到的SCL和SDA位。我剥离的回码是从主机到从属设备的3字节的简单传输。然后,我计算发送的比特数,期望看到24个SCL转换以及3个字节的数据,并能够重建我发送的内容。这是一个轮询实现,我认为它是基本的/简单的,因此它应该运行。命令是:DVRII2C*OPEN()DRVIII2CX传输():我得到的是9 SCL跃迁@ SCL 50 kHz速率,见附件。我期待24个SCL过渡+一些额外的。在数据中,我观察到8个LO位和1个HI位。这与我所期望的不匹配,因此我陷入了困境,需要帮助来解决这个问题。我注意到的另一件事情是,DRV_I2C_BUFFER_EVENT_COMPLETE从来没有发生过,因为我的if语句只有在添加了DRV_I2C_BUFFER_EVENT_ERRO的测试条件之后才会为真。R. So告诉我,对于我所有的传输,我都在一个无休止的循环中,我得到了一个EVEtiON错误。但我不知道为什么或怎么可能。我的循环在每次I2C传输之间有0.5秒的暂停时间,所以,我没有重写一些缓冲区,也没有强调接口,它有足够的时间发送缓冲区。这是我第一次使用I2C接口来工作,因此我努力使代码同时工作,试图把我的观察结果解释回我所期望的,并且到目前为止我的观察结果与我的期望不符。这个打开了portAPP_RESULT LI2C_I2C_I2C_I2C_MasterInit(无效){/*打开I2C端口,如果没有之前的句柄*/如果(li2cData.drvI2CHandle_2CHandle_Master==DRV_HANDLE_HANDLE_INVALIVALIID ==DRV_2cData.drvI2C2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I2C_I I2C_I2C_I2C_I I2C_I I2C_I2C_I2C_I d自己的:APP_RESULT LI2C_I2C_I2C_2C_I2C_Master读数据(APP_UINT16device地址,//APP_UINT16设备地址,//I2C设备地址22222222C设备地址.//I2C装置地址APP_UINT16设备地址APP_UINT_UINT16字节sToToW写入:APP_APP_APP_UINT_UI_UINT8*rxxdataPNT8*rXXXXXXXXPtr,//Byte字节字节字节字节字节字节为写入写入的Byte写(APP_APP_UI_UIUI_UIUIUIUIUIUINT8._UIUINT8*UIUIUIUIUINT8.*APP_UINT16字节To读取)//字节读取{uint8_tTX缓冲器_1.[].{uint8_tTX缓冲器_1[]]=“\\\\x45""1M";1M;\\\\\\x4545454545xx454545451M""1M""1M字节读取读取3;字节读取读取li2cData.drvI2CTxRxBufferHandle)==DRV(LI2C_BUFFER_2C_BUFFER_EVENT_COMPLET_COMPLETE)|_|LI2C_Check_转移_转移状态状态(li2cData.drvI2CHandle_Mas,li2cData.drvI2CHandle2CHandle_Mas_Mas_Master_Master_Master_Master_Mas_Master_Masandle_Masd2cData.d2cData.d2cData.drvI2cData.drvI2c数据数据数据drvI2222CCCdrvI2CCCCCCCCCDrvI25252525252525252525252525252525252525252525252525CCCCCCC16_t)deviceAddress,[0],numOfBytes,[NULL];.(APP_OK);}.(APP_ERROR_I2C_FAIL);}

回帖(2)

李思昊

2019-11-1 09:09:58
嗨,自从我发布这个帖子以来,问题似乎是我与主人和奴隶的互动,并且我不完全理解界面。我会把重点放在修复,所以没有必要回应。吉姆,
举报

李铭鑫

2019-11-1 09:20:06
嗨,关于I2C信令的一些基本知识。I2C协议检查信令是否按预期进行,包括硬件和软件。I2C信令的第9位是Ac.。这样安排使得I2C从应答器在ACK时钟周期内将SDA线拉低。如果没有具有正确地址的I2C从应答,SDA线上的拉升电阻器将使SDA线变高。这就是在逻辑分析器捕获中所看到的。然后驱动程序将停止发送字节,并发送I2C停止信号序列。在停止信号完成后,SCL和SDA线都将是高逻辑电平。代码中是否有断点使开始和停止信号不可见?所有0位的I2C地址是一个特殊的保留地址:General Call,这可能不是您想要的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分