22.4.4模式选择
从发
从收
主发
主收
主模式下:
1.产生CLK信号;
2.START,STOP信号产生,软件控制;
从模式:
1.支持7or10-bit地址,或通用呼叫地址(使能状态下),保留SMBus地址(软件使能)
I2C初始化
1.使能或不使能外设,通过I2C_CR1的PE
注意:当PE=0时,有软复位功效(至少3个APB周期);
复位建议时序为:WritePE=0 -> check PE=0 -> write PE=1
软复位不影响配置寄存器,会影响以下寄存器:
I2C_CR2:START,STOP,NACK
I2C_ISR:BUSY,TXE,TXIS,RXNE,ADDR,NACKF,TCR,TC,STOPE,BERR,ARLO,OVR
在SMBus模式下,还会有:
I2C_CR2:PECBYTE
I2C_ISR:PECERR,TIMEOUT,ALERT
2.在使能PE之前,需要先配置滤波器
注意:在I2C使能后,不允许改变滤波器配置
3.I2C时序配置
I2C_TIMINGR寄存器PRESC[3:0],SCLDEL[3:0],SDADEL[3:0]
注意:1.在I2C使能后,不允许修改时序配置;
2.在I2C使能后,不允许修改NOSTRETCH配置;
22.4.7数据传输
接收:
1.第8个SCL脉冲过后,shift寄存器拷贝至I2C_RXDR(RXNE=0情况下),
若RXNE=1,会把SCL拉低直至I2C_RXDR(旧值)被读走
发送:
1.I2C_TXDR不空(TXE=0),在第9个SCL脉冲后拷贝至shift寄存器
2.假如TXE=1,说明没有数据被写进I2C_TXDR,SCL会被拉低直到I2C_TXDR被写
3.硬件发送管理器:只在主模式下使用
从机模式:
1.初始化
1)最少1个从机地址配置
I2C_OAR1:7or10-bit配置OA1MODE,使能OA1EN
I2C_OAR2:第二个从地址配置
通用地址:GCEN在I2C_CR1配置
当使能了从地址,ADDR中断标志置位,则会根据ADDRIE的产生中断
注意:默认情况下,为了实现软件的行为SCL会被拉低。如果主机不支持时钟拉低功能,必须
配置NOSTRETCH=1在I2C_CR1中
产生ADDR中断后,必须
ADDCODE[6:0]在I2C_ISR中看是否配对;DIR必须检查来判断方向
2)从模式时钟拉低NOSTRETCH = 0
以下情况会拉低
a.ADDR标志置位:可通过ADDRCF=1来清楚,从而释放拉低
b.发送情况下,旧数据传输完成而没有新数据写进I2C_TXDR;或者
在ADDR标志清楚后,没有写第一个字节(TXE=1):可通过写I2C_TXDR来释放拉低状态
c.接收状态下,旧数据还没被读走,新数据已经移位完成:通过读I2C_RXDR
d.TCR=1的从机字节控制模式,可重载模式(SBC=1andRELOAD=1):
通过写NBYTES[7:0]=非0值从而清楚TCR
d.检测到SCL下降沿,SCL被拉低[(SDADEL+SCLDEL+1)*(PRESC+1)]*tI2CCLK
3)从模式不时钟拉低NOSTRETCH = 1
a.ADDR标志置位:SCL不会拉低
b.发送模式,数据必须再SCL脉冲前进行写I2C_TXDR操作,否则会引起I2C_ISR的OVR置位且产生中断(I2C_CR1的ERRIE使能情况下);同样引起OVR置位的有当STOPF置位(尚未清楚)时启动第1个数据发送;因此需要清楚STOPF位
c.接收模式,旧数据必须在新数据准备好后取走,否则产生OVR置位
4)从机字节控制模式
为了允许在从接收模式字节ACK控制,必须使能I2C_CR1的SBC位
a.必须RELOAD=1,以便相应ACK
b.NBYTES必须初始0x1在ADDR中断函数,并且重载0x1在每个接收字节后;
c.当字节接收完成,TCR置位,SCL被拉低,可以读I2C_RXDR值,配置I2C_CR2的ACK来确定是否回应;
SCL释放是通过NBYTES写入非0值(ACK或NACK发送和下一字节允许接收)
d.NBYTES可以大于0x1
注意:
1.SBC必须在I2C未使能,或从设备未匹配地址,或ADDR=1情况下,才配置
2.SBC与NOSTRETCH模式不兼容;不允许NOSTRETCH=1情况下配置SBC
从发:
1.I2C_TXDR为空时,发送中断状态TXIS产生,且I2C_CR1的TXIE=1;
TXIS清楚在I2C_TXDR被写入下个发送数据后
2.当NACK收到时,I2C_ISR的NACKF置位且(当I2C_CR1的NACKIE=1时)产生中断;
会释放SCL和SDA,让主机发STOP或RESTART命令;TXIS不会置位在接收NACK时
3.当收到STOP时且I2C_CR1的STOPIE=1情况下,I2C_ISR的STOPF置位且产生中断;
a.大多应用在SBC=0此情况下,当从机地址匹配ADDR=1时,若TXE=0,可以选择发送
I2C_TXDR作为第一字节,或者通过TXE位来清空T2C_TXDR以备填充新数据
b.在SBC=1情况下,NBYTES必须在地址匹配(ADDR=1)中断函数下配置;在此情况下,
多个TXIS事件产生与NBYTES值对应.
注意:当NOSTRETCH=1情况下,
阅读(3808) | 评论(0) | 转发(0) |