好啦,I2C协议讲解完了,那么正式进入正题:MSP430 I2C如何使用: 先上一张I2C模块的内部结构图:
一堆一堆的寄存器,标志位对吧,最终出来两根线SDA和SCL是吧。就是这样的嘛,内部的模块不就是一些逻辑电路加一些Memory嘛,迷糊没事的,后面看看寄存器就知道了: 那么就开始讲解如何使用吧,也就是寄存器内容啦: 看一下有哪些寄存器:
UCA10:10位地址选择,1时为10位地址模式,0时为7位地址模式。 UCLSA10:Slave10位地址选择,也就是说你作为Master时需要通信的Slave是否是10位地址的模式。 UCMM:多Master选择,因为正常I2C时钟是由Master控制的,因此如果存在多Master时,需要释放SCL的,故设计了这一位用来应对多Master模式。 UCMST:Master或Slave选择,决定MSP430用作I2C中的Master还是Slave。 UCMODEx:模式选择:SPI或者I2C,同时SPI还分为三线和四线模式。 UCSSELx:时钟源选择,建议选SMCLK吧,频率高一点,精度也就高一点。 UCTXACK:回应地址正确,这个是再Slave或者多Master模式下,开启地址掩码功能后,只对比除去掩码的剩下地址,如果一致的话,需要发送个地址确认位(UCSWACK=1时需要手动设置发送,UCSWACK=0时会自动发送),这个就是那个地址确认位。 UCTR:发送还是接受,数据给Slave时是发送,读的时候则是接受或者作为Slave也是接受。 UCTXNACK:发送ACK信号,在Slave模式下使用。 UCTXSTP:生成STOP信号,在Master模式下使用。 UCTXSTT:生成起始信号,在Master模式下使用。 UCSWRST:软件复位使能,默认是1,即不能写一些寄存器设置I2C参数,有些寄存器想进行操作时需要复位这一位。
UCETXINT:这一位仅在Slave模式下有用,决定着什么时候会置位UCTXIFG0(这一位置位标志着有能力去发送数据了),当这一位是1时,收到Master发送过来的START信号就会置位,当这一位是0时,则等到接收到Master发送的地址与自己的地址匹配时,才会置位UCTXIFG0(注意这种情况下地址1-3都要disable)。 UCCLTO:I2C总线时钟超时,也就是可能总线上卡死了,这一位用来设置这个时间,也可以关闭此项功能。如果设置了时间,在超时之后会触发UCCLTOIFG中断,用户可以在中断里重新初始化I2C。 UCSTPNACK:这一位是指在MCU作为Master接受数据时,在收到Slave的最后一个字节数据后可以发送一个响应给Slave,不过这并不符合I2C协议,因此只用在一些特定场合,正常的I2C协议,请忽略。 UCSWACK:看UCBxCTLW0中的UCTXACK描述,这一位和地址掩码有关系。 UCASTPx:自动生成STOP设置,这一位只用在Master模式下,在设置自动生成STOP信号后,发送完设置长度的数据后,I2C内核直接自动发送停止位,这样会简化用户操作。注意:你可能会遇到一个情况:设置自动STOP后,会设置一个发送数据的长度,而这个数据长度寄存器,也就是UCTBCNTx,这个是8位的,也就是最大值就是255了,因此,如果I2C一次性需要传递的数据包超过了255字节,那么有两种方案解决:不要开启STOP,选择手动设置STOP信号,或者启动DMA模块,这两张方式都可以。手动STOP简单一点,DMA速度快一点。 UCGLITx:错误检测位,这一位可以检测信号线上的毛刺噪声,建议直接默认就好啦。
这个寄存器是控制I2C波特率的,目前MSP430的I2C模块支持快速的400Kbps(资料中说的严谨,起始可以更快的)。那么如何计算波特率的呢?看下面框图:
就是对时钟进行分频后,就直接传输给SCL线上了,因此很容易计算,在选择时钟源之后,时钟源的频率除以这一位,就是SCL的时钟频率。
UCBCNTx:只读寄存器,用来获取I2C总线上接受或者发送的数据量。 UCSCLLOW:用来查看SCL状态,可以确定是否有其他设备将此总线时钟拉低了。 UCGC:只读寄存器,标志着是否接收到了通用的Call 地址。 UCBBUSY:只读寄存器,用来查看总线上是否繁忙,一般情况下,为了保证数据发送的严谨性,在数据发送前都要查询这一位来决定是否可以发送数据的。
UCTBCNTx:在上面自动生成STOP信号时提过,这一位用来设置I2C一包数据发送的数量。
I2C数据接受缓冲区,在收到I2C接受中断后(当然是在使能中断后啦),接收到的数据会存放在这个缓冲区里,需要读取出来,读取后会自动清除接收中断。
I2C数据发送缓冲区,也就是如果你想通过I2C协议发送一个数据,那么你只需要把这个数据写入这个寄存器中即可,当数据移入移位寄存器后,开始发送,发送完成后则会触发发中断,代表着当前寄存器的值已经空了,数据已经发送完成,可以写入下一个数据进行发送了。
I2C的general call是一个什么呢? 就类似于广播模式嘛,地址就是0,更多详细资料,请查看I2C官网:https://www.i2c-bus.org/addressing/(PS:推荐大家有问题多去官网查看,官方发布的肯定没什么问题,理解起来不会有误区) UCOAEN:使能自己的I2C地址。 I2COAx:自己的I2C地址0。
参考UCBxI2COA0 UCOAEN:使能自己的I2C地址。 I2COAx:自己的I2C地址1。
参考UCBxI2COA0 UCOAEN:使能自己的I2C地址。 I2COAx:自己的I2C地址2。
参考UCBxI2COA0 UCOAEN:使能自己的I2C地址。 I2COAx:自己的I2C地址3。 总的来说,就是MSP430的I2C模块可以设置4个Slave地址,可以产生不同的I2C中断。
ADDRXx:只读寄存器,接收到数据对方的地址。
ADDMASKx:地址掩码,可以选择性的接受对象固定地址的设备发送来的数据。
I2CSAx:Slave设备的地址,注意,这个只用在MCU作为Master模式下,这一位用来设置你要发送的Slave设备他的地址。
各种各样的中断使能位,这个和IFG中断标志位是匹配的,也就是使能相应的中断后,产生中断的情况下后,会置位相应的中断标志位,然后产生中断。具体每个中断时什么用,请看IFG寄存器的描述。
|