2643|12

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

(以STM8/STM32为例)硬件i2c spi有什么意义? [复制链接]

 

这几天,我突然想起来,想弄明白STM32/STM8的硬件i2c的问题。因为以前,包括正点原子在内,似乎很多人都曾说,STM32的硬件i2c有问题。

这一次,我在STM8S003F3P6上面做了一次I2C,用的是常见的EEPROM,为了尝试效果,我用了STM8S003例程里指定的意法自己的M24C64——当然,我手上也有一块AT24C02。

 

用模拟的我很容易就做出来了——两个EEPROM的都做出来了,其实差别不大,无非就是M24C64的数据地址是2字节罢了。

 

此帖出自stm32/stm8论坛

最新回复

看来你真的是不理解硬件接口的意义。 要么你的理解力不够,要么你的表达能力有问题。   详情 回复 发表于 2020-7-8 14:24
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
本帖最后由 辛昕 于 2020-7-6 04:59 编辑

毫无例外的操蛋硬件i2c例程——不改就没法用

 

         然后,我尝试了硬件的I2C,也就是例程的。但我发现很奇葩,这个例程,我没做任何改动

         ——当然,由于原来的库例程是基于STM8S208写的,所以我做了一些和I2C功能无关的小改动。

        1.具体来说,就是把一个使用GPIOH的LED给去掉——因为STM8S003没那么多脚,没有GPIOH,当然为了避免影响,我把它挪到GPIOD上,而STM8S003的I2C只有一个,就在PB4 PB5上。

        2.例程中的TX BUFFER RXBUFFER过大,STM8S003F3P6没那么大,所以我改小了。

 

          别的就没动过

           然后,毫无意外,尼玛,跑不动,甚至直接卡死了——往细里看,其实和i2c外设无关,其实还是它的例程写法,自己把自己给卡死了

            ——STM32的库,想必大家是知道的,动不动就给你易出错就while,这没啥的。后来我一点点拆开,没很仔细地改,我只是做到了收发单字节成功。

            我没继续往下改,是因为我开始思考必要性问题。

 

            因为我之前写模拟的时候,基本的i2c时序摸得门清。

            STM32也好,STM8也好,它的所谓i2c那个API,其实也就是类似于模拟I2C做的时候那样子做。无非还是 START STOP之类的玩意。

            所以改起来,加上有逻辑分析仪对着看,没啥了不起的。

           但是,我很快发现一个问题。 

           那就是,搞半天,还是要等,搞半天还是要一个一个位的时序构成,无非好点就是,SCK不用自己做,这点舒服。

但SDA上还得来。就是不管是不是自己写GPIO高低,或者判断GPIO高低,但最后,你还是得等待寄存器,那,其实和直接判断IO有毛区别呢?

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
本帖最后由 辛昕 于 2020-7-6 05:00 编辑

是不是如果不用DMA,CPU始终得干活?

 

          我大致浏览了一下RM中的i2c的寄存器,我发现,其实它和我想象的硬件i2c不一样。

          简单说,我想象中的i2c,就是说,一旦我设置好I2C的相应参数后,比如说,设备地址啊,其实数据地址,数据长度啊或者结束数据地址。

          如果高级点的话,也许还可以设置那几个时序中的时间参数——我看到还真有,比如sck的高低时间,就是没那么多时间参数可设置而已。

          我原以为,硬件i2c的功能就是一旦我设置了这些以后,就可以启动一次纯粹不用CPU参与的纯粹硬件外设动作。

结果,从我理解到的I2C寄存器的设置来看,并没这玩意。

 

          那么,想来想去,如果要让CPU不参与,唯有一种办法,就是使用DMA。可是STM8S003木有DMA啊,那这个硬件i2c还有毛线用呢?

         不知道我的理解有没问题。希望各位大佬前辈知道的,K我一顿也行。指导指导。

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

310

帖子

5

TA的资源

一粒金砂(中级)

4
 

没有DMA,你可以用中断

此帖出自stm32/stm8论坛
 
 
 

回复

377

帖子

0

TA的资源

一粒金砂(高级)

5
 

对于没有单周期IO操作功能的8位和16位机,硬件spi和i2c的一个重要意义就是让你在操作i2c和spi的时候不用关中断,|= 和 &=~ 操作IO去模拟i2c和spi是有潜在风险的,硬件spi和i2c不会有这样的问题,即使不用dma和中断,这两种外设依旧有它的价值。当然st的i2c外设是例外,这东西不用也罢

此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
LeoMe 发表于 2020-7-6 10:14 对于没有单周期IO操作功能的8位和16位机,硬件spi和i2c的一个重要意义就是让你在操作i2c和spi的时候不用关 ...

我在你的回复里,听到了一个很关键的东西。

不过即使不是单周期,难道I2C SPI的时序,敏感到查一两个机器周期都会出错?

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
LeoMe 发表于 2020-7-6 10:14 对于没有单周期IO操作功能的8位和16位机,硬件spi和i2c的一个重要意义就是让你在操作i2c和spi的时候不用关 ...

然后,因为我只用过st的i2c,以前别的单片机也用过,但不用我做底层的驱动,所以,能举例说说别的i2c和ST的硬件i2c的区别么?

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 
宋元浩 发表于 2020-7-6 09:37 没有DMA,你可以用中断

它的中断只有回报i2c错误啥的——当然,这个也是我觉得它有用的部分,但是,除了这个,中断又有什么价值呢?

最终还不是要一个一个往DR里填东西或者读出来?除非DMA

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1372

帖子

2

TA的资源

五彩晶圆(初级)

9
 

硬件IIC比软件模拟的优势,首先是写寄存器(设频率,设地址、写数据)之后等结果(标志位)就可以了,CPU可以暂时不管,去干别的事情,或者休眠模式省电。其次是软件模拟要把所有异常状态考虑到,代价(效率)就低了。

既然有硬件IIC,为何不用?

要认为软件GPIO模拟比写操作硬件容易的——模拟个 IIC slave再来说。

此帖出自stm32/stm8论坛
 
 
 

回复

377

帖子

0

TA的资源

一粒金砂(高级)

10
 
辛昕 发表于 2020-7-6 13:40 我在你的回复里,听到了一个很关键的东西。 不过即使不是单周期,难道I2C SPI的时序,敏感到查一两个 ...

不是时序问题,I2c和spi大部分时候你把时钟无限拉长都不会出错,倒是clk快过头了会出错。IO模拟的问题在于没有单周期io的单片机,你要控制某个io就得对io的输出寄存器进行读改写操作,比如stm32的ODR寄存器,问题出在读改写这个操作上,他不是一次完成的。这时候会出一个经典的bug,就是如果你开着中断,中断服务程序里有用到spi或者i2c的这组io,这个时间又正好卡在你读ODR和改写ODR寄存器之间,回写的数据就是错误的。比如PA口全是高点评,这时候ODR是0xFFFF FFFF,你要把PA0写0,你读出0xFFFF FFFF,然后&=~0x0000 0001,正好这个时候中断了,中断服务程序里对PA1操作置为0,然后中断退出,程序继续PA0置为0的操作,回写入ODR的数据是0x FFFF FFFE,但实际上PA1已经在中断里置为0 ,ODR里应该是0x FFFF FFFC。既中断里PA1写0的操作被丢掉了。这时候如果PA1是其他有时序的总线,那么这个总线的时序就出错了。

以前在st和飞思卡尔的数据手册上看到单周期IO的特性,没明白这个功能除了快还有啥用,直到后来被坑了一次又一次。单周期IO操作就是对一个寄存器对应位写1就可以完成IO对应位的置1和置0操作,没有读改写这个过程,就不会出现上面的问题。

此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 
cruelfox 发表于 2020-7-6 16:27 硬件IIC比软件模拟的优势,首先是写寄存器(设频率,设地址、写数据)之后等结果(标志位)就可以了,CPU可以暂 ...

CPU可以暂时不管去做别的事情。

要么你不理解i2c clk的意义,要么你不知道自己在说什么。

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 
LeoMe 发表于 2020-7-7 09:12 不是时序问题,I2c和spi大部分时候你把时钟无限拉长都不会出错,倒是clk快过头了会出错。IO模拟的问题在 ...

这个我以前不知道,要小心点。

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1372

帖子

2

TA的资源

五彩晶圆(初级)

13
 
辛昕 发表于 2020-7-8 13:33 CPU可以暂时不管去做别的事情。 要么你不理解i2c clk的意义,要么你不知道自己在说什么。

看来你真的是不理解硬件接口的意义。

要么你的理解力不够,要么你的表达能力有问题。

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表