OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2789|回复: 5

STM32 IIC总线的讨论 硬件 模拟

[复制链接]

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-8-10
在线时间
5 小时
发表于 2019-8-24 19:40:23 | 显示全部楼层 |阅读模式
最近刚学习IIC,买的STM32H7,觉得IIC设计十分不合理,速度很慢而且还很多芯片用的IIC(MPU9250,EEPROM等,触摸屏)。 现在书里还在用IO模拟IIC,那一堆延时觉得很可怕,一个400MHz的CPU模拟IIC占用了大量时间,现在芯片速度越来越快,难道死磕模拟IIC吗?网上说STM32 IIC有硬件BUG,但是书里写的太草率了。
假设一条指令5ns,模拟IIC一次发送延时68us,一次发送延时相当于CPU执行13600条指令,对于实时系统来说这种延时也很长了。
以前的STM32F1到无所谓,CPU本来就慢,延时68us也无所谓,但高速CPU延时太浪费了。
应该设计一种缓冲机制,CPU将数据写入缓冲区,由硬件按照IIC协议发送,这样不会让CPU死循环。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2018-5-1
在线时间
145 小时
发表于 2019-8-30 15:37:07 | 显示全部楼层
赞!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-8-10
在线时间
5 小时
 楼主| 发表于 2019-9-1 09:56:27 | 显示全部楼层
硬件IIC已经测试通过了,很好用,不需要还用延时模拟时序,直接让硬件自己去发送,方便多了。
经过测试,硬件IIC并无BUG,可能之前有,新的芯片修复了。

结论:可以大胆用硬件IIC,很方便,很稳定(并不像书中写的不稳定)。测试了读写上万次EEPROM与10分钟写PCF8574 IO扩展,程序都正常。

测试程序代码:

uint32_t I2C_EE_ByteWrite(uint8_t *pBuffer, uint8_t WriteAddr, uint8_t NumByteToWrite)
{
        HAL_StatusTypeDef status = HAL_OK;

        status = HAL_I2C_Mem_Write(&hi2c2, 0XA0, (uint16_t)WriteAddr, I2C_MEMADD_SIZE_8BIT, pBuffer, NumByteToWrite, 100);

        /* Check the communication status */
        if(status != HAL_OK)
        {
            /* Execute user timeout callback */
        }
        while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
        {
               
        }

        /* Check if the EEPROM is ready for a new operation */
        while (HAL_I2C_IsDeviceReady(&hi2c2, 0XA0, 300, 300) == HAL_TIMEOUT);

        /* Wait for the end of the transfer */
        while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
        {
               
        }
        return status;
}

uint32_t I2C_IOE_ByteWrite(uint8_t dat)
{
        HAL_StatusTypeDef status = HAL_OK;
       
        status = HAL_I2C_Master_Transmit(&hi2c2, 0x40, &dat, 1, 100);
        while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
        {
               
        }
        return status;
}

uint8_t I2C_IOE_ByteRead(void)
{
        uint8_t dat;
        HAL_I2C_Master_Receive(&hi2c2, 0x40, &dat, 1, 100);
        while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
        {
               
        }
        return dat;
}

uint32_t I2C_EE_BufferRead(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)
{
        HAL_StatusTypeDef status = HAL_OK;
       
        status = HAL_I2C_Mem_Read(&hi2c2,0XA0,ReadAddr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)pBuffer, NumByteToRead,10);

        return status;
}

模拟IIC需要关闭中断保证时序,硬件IIC时序由硬件生产,CPU可以相应中断,当然,更好的方法中断模式IIC,可以完全让CPU无等待,极大提高系统性能。
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-9-1 15:15:47 | 显示全部楼层
用硬件调不出来, 难度你让他给老板说自己的水平的问题么, 当然是说硬件有Bug啊
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2019-7-24
在线时间
42 小时
发表于 2019-9-10 13:10:59 | 显示全部楼层
BeautifulFeet 发表于 2019-9-1 09:56
硬件IIC已经测试通过了,很好用,不需要还用延时模拟时序,直接让硬件自己去发送,方便多了。
经过测试, ...

楼主,可以分享一下硬IIC的工程吗?请教指点指点
回复 支持 反对

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-9-10 16:29:24 | 显示全部楼层
edmund1234 发表于 2019-9-1 15:15
用硬件调不出来, 难度你让他给老板说自己的水平的问题么, 当然是说硬件有Bug啊

哈哈,有道理
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 14:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表