发新帖我要提问
12
返回列表
打印
[STM32F0]

从机发的第一个字节错误

[复制链接]
楼主: wyjie
手机看帖
扫描二维码
随时随地手机跟帖
21
I2c有个状态中断,依据不同的状态,其操作不一样

使用特权

评论回复
22
xxrs| | 2022-5-8 11:31 | 只看该作者
void  I2C1_ER_IRQHandler(void){
        if (I2C_GetFlagStatus(I2C1, I2C_FLAG_AF))        {
                I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
                 I2C_ClearFlag(I2C1, I2C_FLAG_AF);
                 Message.status = I2C_STATUS_ERR;
        }
        if (I2C_GetFlagStatus(I2C1, I2C_FLAG_BERR))        {
                I2C_ClearFlag(I2C1, I2C_FLAG_BERR);
        }
        if (I2C_GetFlagStatus(I2C1, I2C_FLAG_OVR))        {
                I2C_ClearFlag(I2C1, I2C_FLAG_OVR);
        }
        if (I2C_GetFlagStatus(I2C1, I2C_FLAG_ARLO))
        {
                I2C_ClearFlag(I2C1, I2C_FLAG_ARLO);
        }
}
   
void I2C1_EV_IRQHandler(){
        uint16_t SR1;
        uint16_t SR2;
         SR1 = I2C1->SR1;
         // Start bit event
        if (SR1 & I2C_SR1_SB)        {
                if (Message.status == I2C_STATUS_START)                {
                        I2C_Send7bitAddress(I2C1, Message.slaveAddress << 1, I2C_Direction_Transmitter);//2
                        Message.status = I2C_STATUS_ADDRESS;
                }
                else if (Message.status == I2C_STATUS_START_R)                {
                        I2C_AcknowledgeConfig(I2C1, ENABLE);//5 转为读数据
                        I2C_Send7bitAddress(I2C1, Message.slaveAddress << 1, I2C_Direction_Receiver);
                        Message.status = I2C_STATUS_REDATA;
                }
        }
        else if (SR1 & I2C_SR1_ADDR)//地址传输完成        {
                SR2 = I2C1->SR2;
                 if (Message.status == I2C_STATUS_ADDRESS)//发送寄存器地址
                {
                        I2C_SendData(I2C1, Message.regAddress);//4 发送地址
                }
                if (Message.Length == 1)//只接受一个字节
                {
                        if (Message.status == I2C_STATUS_REDATA)
                        {
                                I2C_AcknowledgeConfig(I2C1, DISABLE);
                        }
                }
                 I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
            }
        else if (SR1 & I2C_SR1_BTF)        {                //4 上次传输完成
                 if (SR1&I2C_SR1_TXE)//发送完成
                {
                        if (Message.direction == i2cRead)//读数据
                        {
                                if (Message.status == I2C_STATUS_ADDRESS)//寄存器发送完
                                {
                                        I2C1->CR1 = (I2C_CR1_START | I2C_CR1_PE);//
                                        Message.status = I2C_STATUS_START_R;//启动读数据
                                }
                        }
                        else//写数据
                        {
                                I2C_SendData(I2C1, Message.buffer[Message.Index++]);
                                if (Message.Index == Message.Length)
                                {
                                        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);//关闭中断
                                        I2C1->CR1 = (I2C_CR1_STOP | I2C_CR1_PE);//后续测试是否添加
                                        Message.status = I2C_STATUS_FINSIH;
                                }
                        }
                }
        }
        if (SR1 & I2C_SR1_RXNE)
         {
                 Message.buffer[Message.Index++] = I2C_ReceiveData(I2C1);
                 if (Message.Index == Message.Length - 1)
                {
                        I2C_AcknowledgeConfig(I2C1, DISABLE);//末尾数据禁止应答
                }
                 if (Message.Index == Message.Length)
                {
                        I2C1->CR1 = (I2C_CR1_STOP | I2C_CR1_PE);//后续测试是否添加
                        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);//接受结束
                        Message.status = I2C_STATUS_FINSIH
;                }
        }
        else if (SR1 & I2C_SR1_TXE)
        {
         }
}

仅供参考,网上有很多

使用特权

评论回复
23
chenjun89| | 2022-5-8 11:33 | 只看该作者
什么意思?读从机数据第一个字节错误?

使用特权

评论回复
24
wyjie|  楼主 | 2022-5-8 11:39 | 只看该作者
基于库不一样,很多时候都编译不了,一大推的错误,如何去看,接收的时候要关注哪些寄存器?

使用特权

评论回复
25
supernan| | 2022-5-8 11:39 | 只看该作者
如果你用之前买的那个板子换io试试 看看可以吗 先排除硬件问题

使用特权

评论回复
26
wyjie|  楼主 | 2022-5-8 11:42 | 只看该作者
奇怪的,为什么用STM32作为I2C从机的时候,第一次发出的数据第一个字节总是是固定用0xFF(第二次被读访问后,则用的是上一次的最后一个数据),第二个发出的字节就是预先的第一个字节;第三个字节就是预想发送的第二个个字节(数据由逻辑分析仪得出);
是为什么?
0xff 0x11 0x22。。。。。
正确的应该是 0x11 0x22 0x33。。。。。
之后便是:0x33 0x11 0x22

是不是在哪个地方需要清理一下? 怎么清理??

使用特权

评论回复
27
wyjie|  楼主 | 2022-5-8 11:45 | 只看该作者

uint8_t User_RXBuffer[3]={0};//用于I2C从机被访问写时收数据
uint8_t User_TXBuffer[]={0x11,0x22,0x33};//用于I2C从机被访问读时候发出固定数

//以下是中断服务内容


if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_ADDR)==SET)
{
  if(I2C1->ISR&I2C_ISR_DIR)
  {
   Tx_count=0;
   I2C1->ISR|=I2C_ISR_TXE;
   I2C1->ICR|=I2C_ICR_ADDRCF;
  }
  else
  {
   Rx_count=0;
   I2C1->ISR|=I2C_ISR_TXE;
   I2C1->ICR|=I2C_ICR_ADDRCF;
  }
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_RXNE)==SET)
{
  User_RXBuffer[Rx_count++]=I2C1->RXDR;
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_TXIS)==SET)
{
  I2C1->TXDR=User_TXBuffer[Tx_count++];
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_STOPF)==SET)
{
  I2C1->ICR|=I2C_ICR_STOPCF;
  Rx_count=0;
  Tx_count=0;
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_NACKF)==SET)
{
  I2C1->ICR|=I2C_ICR_NACKCF;
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_ARLO)==SET)
{
  I2C1->ICR|=I2C_ICR_ARLOCF;
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_BERR)==SET)
{
  I2C1->ICR|=I2C_ICR_BERRCF;
}
else if(__HAL_I2C_GET_FLAG(&hi2c1,I2C_ISR_OVR)==SET)
{
  I2C1->ICR|=I2C_ICR_OVRCF;

}

使用特权

评论回复
28
wyjie|  楼主 | 2022-5-8 11:50 | 只看该作者

使用特权

评论回复
29
wyjie|  楼主 | 2022-5-8 11:54 | 只看该作者

使用特权

评论回复
30
zwll| | 2022-5-8 11:54 | 只看该作者
楼主能否提供一下代码参考一下,我配置的对的但是读出来的数据也是0

使用特权

评论回复
31
tpgf| | 2022-6-3 08:49 | 只看该作者
每包的第一个字节都是错误吗

使用特权

评论回复
32
drer| | 2022-6-3 09:01 | 只看该作者
返回错误代码了是吗

使用特权

评论回复
33
qcliu| | 2022-6-3 09:12 | 只看该作者
用io模拟试试看吧

使用特权

评论回复
34
coshi| | 2022-6-3 09:21 | 只看该作者
跟其他中断没有什么不同啊

使用特权

评论回复
35
kxsi| | 2022-6-3 09:36 | 只看该作者
抓一下波形看看时序对不对

使用特权

评论回复
36
wiba| | 2022-6-3 09:44 | 只看该作者
iic模块本身的bug吧

使用特权

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

本版积分规则