IIC主从机通信问题

2019-07-20 12:08发布

目前手里有个项目,需要用到IIC通信;
主机用STM32模拟iic,从机用STM8硬件IIC。
现在的问题是主机可以与从机通信,也能讲数据读回来,但是有一点:
收到的第一个字节总是0XFF,然后才是我需要的数据;
但是收到的数据顺序总是不断变化;偶尔数据中还会出现一个字节是0xff。

希望有做过IIC主从机通信的朋友,给予帮助,感激不尽!!!

下面贴上代码:
主机的读数据函数

[mw_shl_code=c,true]
uint32_t read_one_byte(uint8_t s8_address)
{
        uint8_t i;
        uint32_t rec_32_buff;
        bsp_SimuI2C_start(&TouchI2cPort);
        bsp_SimuI2C_write_byte(&TouchI2cPort,s8_address);
        bsp_SimuI2C_SandAck(&TouchI2cPort);
        for(i=0;i<4;i++)
        {
                rec_32_buff<<=8;
          rec_32_buff+=bsp_SimuI2C_read_byte(&TouchI2cPort);
                bsp_SimuI2C_SandAck(&TouchI2cPort);
        }
        bsp_SimuI2C_stop(&TouchI2cPort);
        return rec_32_buff;
}
[/mw_shl_code]

接下来是STM8从机程序:
这是IIC中断函数
[mw_shl_code=c,true]
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
   //接收发送
    u8 temp = 0;
    if (I2C->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)
    {
        temp = I2C->SR3&0x07;
    }
    else if ((I2C->SR1&0x84)&&(I2C->SR3&0x04))//数据字节传送完
    {
       if(data_len>=4)data_len=0;
       I2C->DR = My_Buffer[data_len];
       data_len++;
    }
    else if ((I2C->SR1&0x40)&&(0 == (I2C->SR3&0x04)))//接收时数据寄存器
    {
        temp = I2C->DR;    //读取数据寄存器
    }
    else if (I2C->SR1&0x10)//检测到停止位
    {
        I2C->CR2 = I2C->CR2;//清除停止位
    }
    //错误处理
    if (I2C->SR2&0x01)//总线错误
    {
        I2C->SR2 &= ~0x01;//清零
    }
    else if(I2C->SR2&0x02)//仲裁失败
    {
        I2C->SR2 &= ~0x02;//清零
    }
    else if(I2C->SR2&0x04)//应答失败
    {
        I2C->SR2 &= ~0x04;//清零
    }
    else if(I2C->SR2&0x08)//上溢、下溢
    {
        I2C->SR2 &= ~0x08;//清零
    }
    return;
}
[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。