原创 STM32L系列I2C应用注意

2020-7-9 15:12 5669 20 20 分类: MCU/ 嵌入式 文集: STM32应用
噪音滤波器
I2C模块包含模拟噪音滤波器和数字噪音滤波器,其中模拟噪音滤波器可以抑制尖峰宽度高达50ns(满足快速模式协议规格),用户可以选择关闭这一特性;数字滤波器抑制尖峰噪音的长度可以通过软件配置,范围为1~15(DNF)个I2CCLK周期,当这一特性开启后,SCL/SDA线的电平只有在DNF*I2CCLK周期内持续保持稳定时才会改变

I2C时序
当检测到SCL下降沿时,再一段延迟等待,SDA数据才会被送出。这个等待延迟由Tsdadel定义,时序寄存器中SDADEL位用于该延时配置。Tsdadel = SDADEL * Tpresc + Ti2cclk,其中Tpresc=(PRESC+1)*Ti2cclk。总的SDA输出延时等于Tsync1+{[SDADEL * (PRESC + 1) + 1] * Ti2cclk}

数据传输(通过发送寄存器、接收寄存器和移位寄存器实现)
接收:SDA输入信号填入移位寄存器,第8个SCL脉冲后,当RXNE=0时,移位寄存器的内容会复制进接收寄存器;当RXNE=1时,意味着前一个数据还没有被读出,此时SCL线会被拉低(STRETCHED),直到前一个数据被读出,SCL延伸信号会被插入在第8与第9个SCL脉冲之间(即ACK信号前)
发送:发送寄存器非空时(TXE=0),该数据会在第9个SCL脉冲后被复制到移位寄存器,然后移位寄存器的内容会陆续发送到SDA线上。如果TXE=1,意味着数据寄存器中没有数据,此时SCL线会被拉低(STRETCHED),直到新的数据被写入。SCL延伸信号会在第9个SCL脉冲后插入。

硬件传输管理
I2C内嵌一个字节计数器,用于管理字节传输以及不同模式下执行关闭通讯操作,如主模式下的NACK/STOP/RESTART,从模式下的ACK控制,SMBUS特性时的PEC产生以及校验
字节计数器在主模式时会被打开。而从模式下默认会被关闭,但可以通过软件开启(CR2:SBC位)
要传输的字节个数在CR2:NBYTES[7:0]中定义(如果字节个数超过255或者需要在每次收到数据后都发送ACK,则需要将CR2:RELOAD位置1),如果定义的字节数传输完成后,TCR标志会被置1,SCL会被拉伸直到TCR标志被清除(NBYTES写入非0值时会清除TCR标志)
主模式下,当RELOAD=0且AUTOEND=1时,一旦定义的字节数传输完毕,STOP条件会被自动发出
主模式下,当RELOAD=0但AUTOEND=0时,定义的字节数传输完毕后,TC标志会被置位,SCL信号会被拉伸直到TC标志被清除(当发送START或STOP条件时,TC标志会被清除)
RELOAD=1时,AUTOEND位无效

I2C从机初始化
I2C模块提供了2个从机地址寄存器,地址1可以被配置为7位模式或10位模式,地址2为7位地址但可以配合屏蔽选项以选择使用不同的地址
默认情况下,时钟拉伸功能会被启用,如果I2C主机不支持该功能,则需要设置NOSTRETCH=1以关闭该功能
收到ADDR匹配中断后,需要读取ISR:ADDCODE[6:0]以确认匹配的地址,以及通过DIR标志来识别传输的方向
当NOSTRETCH=0时,收到ADDR匹配后,SCL时钟线会被拉伸直到ADDR标志被清除;在数据发送过程中,如果前一个数据传输已经完成,新的数据还没有被写入数据发送寄存器,或者在ADDR标志被清除时,第一个传输数据还没有被写入到数据发送寄存器(TXE=1),这两种情况下,SCL信号都会被拉伸,直到新的数据被写入至数据发送寄存器;在接收过程中,当数据接收寄存器的数据还没有被读出而新的数据又收到的时候,SCL时钟信号会被拉伸,直到数据接收寄存器中的数据被读出后才会释放;在从机字节控制模式下,当设定的字节数被传输完成后(TCR=1),重加载模式(SBC=1,RELOAD=1)意味着最后一个字节数据已经被传输完毕,SCL时钟会被拉伸直至一个非0数据被写入至NBYTES[7:0]位中
当NOSTRETCH=1时,I2C从机将不会执行SCL信号拉伸操作。数据发送过程中,在第一个SCL脉冲发生时,如果数据发送寄存器的内容为空,则溢出(UNDERRUN)标记OVR会被置位;在首个数据发送开始时,STOPF位如若仍处于置位状态,OVR标志也会被置位;在接收过程中,用户必须在下个数据的第9个SCL脉冲(ACK脉冲)前把数据接收寄存器的内容读出,否则溢出(OVERRUN)标记OVR会被置位

从机字节控制模式(NOSTRETCH必须为0)
为兼容SMBUS标准,在从机接收模式下,为了允许字节ACK控制,从字节控制模式必须被打开,在此情况下,RELOAD标志必须被置1。为了对每个数据字节进行控制,在ADDR匹配中断处理程序中,NBYTES必须被初始化为1。当数据字节收到后,TCR标志置1,SCL信号在第8到第9个脉冲之间被拉伸,用后可以读取数据接收寄存器,并决定回复ACK还是NACK信号。

从机发送
数据发送寄存器为空时,TXIS传输中断状态位会被置1,当写入新的数据至数据发送寄存器时,TXIS位会被清除。当收到NACK确认信息时,NACKF标志位会被置1,从机自动释放SCL和SDA信号线以使主机可以发送STOP或RESTART条件。当STOP信息收到时,STOPF标志位会被置1,。当收到从机地址时(ADDR=1),用户可以选择发送数据寄存器的内容或者置位TXE位清除数据发送寄存器的内容,以便可以写入新的数据供下次发送。
当NOSTRETCH=1时,SCL时钟信号不会被拉伸,所以用户不能在ADDR接收中断程序中写数据发送寄存器,所以即将发送的数据必须被提前写入

主机发送
TXIS标志在每次字节传输完成后置1(ACK收到后),TXIS事件数取决于NBYTES的值,如果传输字节总数大于255,RELOAD标志位需要被置1,此时若数据传输数到达255时,TCR标志会被置1,同时SCL线会被拉伸,直到NBYTES位被写入新的字节长度值。如果NACK收到后,TXIS标志不会被置1。
当RELOAD=0且NBYTES数据量被传输完成后:STOP条件被自动送出(AUTOEND=1),或者TC标志被置1且SCL线被拉伸(AUTOEND=0),直到RERSTART或STOP条件被发出

主机接收
收到一个字节后,RXNE标志会被置1
当RELOAD=0且NBYTES数据量已经被接收时,NACK和STOP条件会被自动送出(AUTOEND=1),或者NACK被自动送出(AUTOEND=0),TC标志被置1且SCL线被拉伸,直到RERSTART或STOP条件被发出

I2C错误
总线错误BERR:在没有收到ACK/NACK时(未到第9个时钟脉冲时),检测到START或STOP条件即产生总线错误。只有参与通讯的主设备或已经寻址的的从设备才会产生总线错误。
仲裁丢失ARLO:当一个高电平发送至SDA数据线上,当在SCL上升沿时检测到SDA为低,此时产生仲裁丢失错误。在主模式,仲裁丢失会在寻址阶段、数据阶段以及数据确认阶段进行探测。如果发生该错误,START控制位会被清除,SCL/SDA数据线会被释放,主设备自动切换至从设备。在从模式时,仲裁丢失仅在数据阶段和数据确认阶段探测,发生该错误后,传输终止,SCL/SDA信号线会被释放
溢出错误OVR:溢出错误仅发生在从模式下且NOSTRETCH=1时。在接收数据时,新的数据到来但旧数据还没有被读出,此时新的数据会被丢弃,NACK会被自动发出。在发送数据时,当数据字节需要被送出时,发送寄存器的内容还是为空(TXE=1),此时0xFF会被送出
包错误校验错误PECERR:SMBUS相关,略
超时错误TIMEOUT:SMBUS相关,略

作者: RLink, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3918760.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条