打印
[STM32F1]

双机通讯时在从机地址接收时出现了问题

[复制链接]
573|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2020-10-10 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32,i2c双机通讯

使用特权

评论回复
沙发
dengdc| | 2020-10-10 20:02 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
wyjie|  楼主 | 2020-10-10 20:06 | 只看该作者

主机接收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;
}

使用特权

评论回复
地板
heweibig| | 2020-10-10 20:11 | 只看该作者
楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
5
wyjie|  楼主 | 2020-10-10 20:16 | 只看该作者
两个程序都卡在了ADDR的判断循环里

使用特权

评论回复
6
wuhany| | 2020-10-10 20:21 | 只看该作者
STM32的I2C建议采用模拟。

使用特权

评论回复
7
jiahy| | 2020-10-10 20:24 | 只看该作者

用示波器先对下时序;

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

使用特权

评论回复
8
shimx| | 2020-10-10 20:27 | 只看该作者
请问,用什么来模拟调I2C啊

使用特权

评论回复
9
jiaxw| | 2020-10-10 20:31 | 只看该作者
普通IO就可以,关键是时序

使用特权

评论回复
10
langgq| | 2020-10-10 20:34 | 只看该作者
你先用官方的例子跑个看看能行不,如果行,那就是自己配置的有问题。

使用特权

评论回复
11
huanghuac| | 2020-10-10 20:37 | 只看该作者

那可以在软件里边修改地址啊

使用特权

评论回复
12
wenfen| | 2020-10-10 20:40 | 只看该作者
iic的地址也要根据具体芯片来说的

使用特权

评论回复
13
tian111| | 2020-10-10 20:55 | 只看该作者
什么叫地址接收啊

使用特权

评论回复
14
stly| | 2020-10-10 20:57 | 只看该作者
发生冲突了吗 两个地址一样了?

使用特权

评论回复
15
pengf| | 2020-10-10 21:01 | 只看该作者
单个挂上进行设置

使用特权

评论回复
16
houcs| | 2020-10-10 21:04 | 只看该作者
iic是一个很麻烦的通讯

使用特权

评论回复
17
ousj| | 2020-10-10 21:07 | 只看该作者

用io口模拟吧

使用特权

评论回复
18
kangzj| | 2020-10-10 21:12 | 只看该作者
没看明白楼主说的什么意思

使用特权

评论回复
19
wyjie|  楼主 | 2020-10-10 21:16 | 只看该作者

嗯,预料中的结果,多谢大家啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

927

主题

12706

帖子

5

粉丝