请教stm32的i2c接收问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教stm32的i2c接收问题相关的知识,希望对你有一定的参考价值。

参考技术A void I2C_ReadS_24C(u8 addr ,u8* pBuffer,u16 no)

if(no==0) return;

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // 这里判断总线忙闲
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 发送起始位 */
I2C_GenerateSTART(I2C1, ENABLE); // 发送起始标志位
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

#ifdef AT24C01A
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); //这里主机发送Epprom的地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //

/*发送地址*/
I2C_SendData(I2C1, addr); //这里发送Epprom内部寄存器地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/

/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE); //发送起始标志位 只是这里不懂为什么还需要发送一次。。。。。。
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

/*器件读*/
I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver); 这里和上面发送Epprom的地址有何不同,主要也不懂这句话的作用
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

#else
/*发送器件地址(读)24C02*/
I2C_Send7bitAddress(I2C1, addr<<1, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
#endif

while (no)

if(no==1)

I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的 传输完后要关闭应答
I2C_GenerateSTOP(I2C1, ENABLE); //发送停止位


while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */ //实际上是判断上次的i2c的操作是不是字节接收 ,可是并不是啊,那不应该是死循环么。我觉得这里还没有开始接收
*pBuffer = I2C_ReceiveData(I2C1);
pBuffer++;
/* Decrement the read bytes counter */
no--;

STM32 RW问题请教

参考技术A RW段中存放的一般是静态变量,包括全局静态变量和局部静态变量,初始化或未初始化的。按你描述的,在函数调用的时候,也就是正常运行的时候,这个0x20000044内存值有变化。但是在单步调试的时候,不变。我个人觉得可能是你当前这个跟踪的函数以外,有什么地方改变了它。在全速运行时,花不了多长时间就会发现值变了,但是单步调其实是很慢的,很难复现这个情况。这样,你先查查0x20000044这个是被编译器分配来做什么用的,是不是中断向量表的一部分,还是说是什么静态变量的存储地址。接着再往下查,是静态变量的话,它是什么变量,在代码中查查被哪些地方读写过,有没有可能是被“多线程”方式改变了。另外也比较怀疑是做IAP时有点问题,IAP过程如果用到中断向量表(这几乎是一定要用到的),一定要注意中断向量表重映射的问题,你说的0x20000044和0x20000000很近,0x20000000可能就是你这个STM32
CPU的RAM,重映射中断向量表的时候,一般要重映射到RAM中,不知道是不是IAP相关的代码影响到了这个内存值的变化,注意查查这个问题

以上是关于请教stm32的i2c接收问题的主要内容,如果未能解决你的问题,请参考以下文章

请教stm32F407以太网发送和接收帧的格式

STM32通信硬件 I2C

STM32F10x_模拟I2C读写_硬件I2C读写

请教STM32的 SPI 同时中断收发问题

请教STM32的SPI通信中的CRC校验问题 SPI

为啥说stm32 的i2c鸡肋