开源,STM32口线模拟I2C程序

2019-12-31 19:20发布

<p> 在STM32的I2C上摔了一跤,测试了官方提供的几个例程和库,都有不同缺陷,也无法弥补:</p><br><p> 1、查询方式,在连续读数据的过程中不能中断</p><br><p> 2、DMA方式类似,在同一DMA中I2C的级别必须最高,否则同1.</p><br><p> 3、中断方式也不能有更高优先级中断I2C,否则同1.</p><br><p> 鉴于以上原因,无奈的口线模拟了I2C。(仅仅代表个人看法,欢迎指正)</p><br><p> 附件中的项目文件已经过测试,为感谢OUR这几年的帮助,先开源这个小程序。</p><br><p>链接:&nbsp;https://pan.baidu.com/s/1by6r7jLqoLJuGR8bl6Sk4A&nbsp;提取码:&nbsp;jfkn&nbsp;复制这段内容后打开百度 {MOD}手机App,操作更方便哦</p><p><br></p>
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
97条回答
yangwc
2020-01-12 01:32
使用24C64时:

//读出1串数据         存放读出数据  待读出长度      待读出地址       器件类型(24c64)       
bool I2C_ReadByte(u8* pBuffer,   u8 length,     u16 ReadAddress,  u8 DeviceAddress)
{               
    if(!I2C_Start())return FALSE;
        I2C_SendByte(DeviceAddress & 0xFFFE);   //设置器件写地址
    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
        I2C_SendByte((u8)((ReadAddress & 0x1F00) >> 8));   //设置高起始地址
        I2C_WaitAck();
    I2C_SendByte((u8)(ReadAddress & 0x00FF));   //设置低起始地址      
    I2C_WaitAck();
    I2C_Start();
        I2C_SendByte(DeviceAddress | 0x0001);     //设置器件读地址
    I2C_WaitAck();
    while(length)
    {
      *pBuffer = I2C_ReceiveByte();
      if(length == 1)I2C_NoAck();
      else I2C_Ack();
      pBuffer++;
      length--;
    }
    I2C_Stop();
    return TRUE;
}

//写入1字节数据       待写入数据    待写入地址       器件类型(24C64)
bool I2C_WriteByte(u8 SendByte, u16 WriteAddress, u8 DeviceAddress)
{               
    if(!I2C_Start())return FALSE;
        I2C_SendByte(DeviceAddress & 0xFFFE);   //设置器件地址
    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
        I2C_SendByte((u8)((WriteAddress & 0x1F00) >> 8));   //设置高起始地址
        I2C_WaitAck();
    I2C_SendByte((u8)(WriteAddress & 0x00FF));   //设置低起始地址
             
    I2C_WaitAck();       
    I2C_SendByte(SendByte);
    I2C_WaitAck();   
    I2C_Stop();
        delay(1);
        //注意:因为这里要等待EEPROM写完,可以采用查询或延时方式(10ms)
    //Systick_Delay_1ms(10);
    return TRUE;
}

一周热门 更多>