双机通讯时在从机地址接收时两个程序都卡在了ADDR的判断循环里

2019-07-14 15:17发布

使用的设备为STM32,i2c双机通讯,主机接收n个字节:
void I2C_ByteRead(void)
{
                 while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
                 
                 I2C_GenerateSTART(I2C2, ENABLE);
                 //EV5
                 while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
                 //while(!((uint16_t)(I2C2->SR1)&(uint16_t)(0x0001)));//SB=1
                 //while(((uint16_t)(I2C2->SR2)&(uint16_t)(0x0003))!=0x0003);//BUSY=1
                 I2C_Send7bitAddress(I2C2, I2C2_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
                 
                 //EV6
                 while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
                 //while(((uint16_t)(I2C2->SR1)&(uint16_t)(0x0002))!=0x0002);//??????????
                 //while(((uint16_t)(I2C2->SR2)&(uint16_t)(0x0003))!=0x0003);
                 while(RxCounter!=BUFFER_SIZE)
                 {
                          if(RxCounter==(BUFFER_SIZE-1))
                          {
                                         if(I2C_GetFlagStatus(I2C2, I2C_FLAG_RXNE)==1)
                                         {
                                                  I2C_AcknowledgeConfig(I2C2, DISABLE);
                                                  I2C_GenerateSTOP(I2C2, ENABLE);
                                         }
                         }
                         //EV7
                         while(!(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)));
                         //while(((uint16_t)(I2C2->SR1)&(uint16_t)(0x0040))!=0x0040);
                         //while(((uint16_t)(I2C2->SR2)&(uint16_t)(0x0003))!=0x0003);
                         RxBuffer[RxCounter++] = I2C_ReceiveData(I2C2);
                 }
                 
                 I2C_GenerateSTOP(I2C2, ENABLE);
                 I2C_AcknowledgeConfig(I2C2, ENABLE);
                 RxCounter=0;
}
从机发送n个字节:
void I2C_ByteWrite()
{
     while(((uint16_t)(I2C2->SR1)&(uint16_t)(0x0002))!=0x0002);//ADDR=1 receive address matched
     while(((uint16_t)(I2C2->SR2)&(uint16_t)(0x0006))!=0x0006);//BUSY=1+MSL=0+TRA=1
     I2C_SendData(I2C2,TxBuffer[TxCounter++]);
         
     while(TxCounter!=BUFFER_SIZE)
           {
                         while(((uint16_t)(I2C2->SR1)&(uint16_t)(0x0080))!=0x0080);//DRΪ¿ÕʱΪ1£¬Ð´ÈëDRÇå³ý¸Ãλ
                        I2C_SendData(I2C2,TxBuffer[TxCounter++]);
                 }
                 
                 while(((uint16_t)(I2C2->SR1)&(uint16_t)(0x0010))!=0x0010);
                 TxCounter=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
blueshine
1楼-- · 2019-07-14 20:39
用示波器先对下时序;

可以先用模拟先调通,再改成硬件的;


nhonglan
2楼-- · 2019-07-14 21:23
请问,用什么来模拟调I2C啊
LEON1985
3楼-- · 2019-07-14 22:03
普通IO就可以,关键是时序
musicalboy
4楼-- · 2019-07-15 00:52
你先用官方的例子跑个看看能行不,如果行,那就是自己配置的有问题。
fhbding
5楼-- · 2019-07-15 01:10
 精彩回答 2  元偷偷看……
blust
6楼-- · 2019-07-15 06:33
软件模拟I2C网上应该很多例程,可以参考下。

一周热门 更多>