STM32F0实战:基于HAL库开发【3.4】
本文详细介绍了I2C通信协议中从机和主机的工作模式及数据传输过程。在从机模式下,重点阐述了发送和接收数据时的寄存器操作流程,包括时钟延长机制、应答处理以及错误检测等关键环节。主机模式部分则说明了7位和10位地址的寻址方式,以及自动结束和软件结束两种传输模式下的操作差异。通过多个实例图示,具体展示了在不同配置下(如时钟延长使能/禁用、自动/软件结束模式)的数据传输时序和寄存器状态变化,为理解I2C通
16.2.3 从机发送
在允许时钟延长的情况下,从机发送的过程如图16-9所示。当从机初始化完成后,一旦I2C_ISR寄存器的ADDR位置位,即表明从机已经被寻址,这时从机时钟延长开启,如果需要可以软件读取I2C_ISR寄存器的ADDCODE和DIR位,以确定被寻址的从机地址以及数据的传输方向,还可以软件将I2C_ISR寄存器的TXE位置位来清空I2C_TXDR寄存器。当上述处理结束后,可以软件设置I2C_ICR寄存器的ADDRCF位以清除ADDR位,该清除操作将会使从机发送一个应答位,如果之前没有清空I2C_TXDR寄存器,其内容将会保存至移位寄存器,并且硬件开启数据的发送。
当I2C_ISR寄存器的TXIS位置位后,表明发送数据寄存器I2C_TXDR为空,这有两种可能,一是之前存入I2C_TXDR寄存器的数据已经转移至移位寄存器,二是对于I2C_TXDR寄存器的清空操作已经完成。这时如果I2Cx_CR1寄存器中的TXIE位为1,则会产生中断。向I2Cx_TXDR寄存器中写入要发送的数据,写操作将清除TXIS位,数据发送完成后,主机接收方将回应一个应答位在总线上,从机在接收到应答位后TXIS位会再次硬件置位。检测TXIS置位并持续写入I2Cx_TXDR寄存器将可以维持一个数据发送流。
当从机收到一个非应答位(NACK)时,TXIS位将不会置位,但I2Cx_ISR寄存器的NACKF位将会置1,如果I2Cx_CR1寄存器的NACKIE位为1,则会产生一个中断。这时从机会自动释放SCL和SDA线,以便于主机可以执行停止或重复起始条件,当从机收到一个停止条件(STOP)时,I2Cx_ISR寄存器中的STOPF标志会置1,如果这时I2Cx_CR1寄存器的STOPIE位为1,就会产生一个中断,从机接收到停止条件后也表明本次数据传输结束。
在大多数的从机发送应用中,从机字节控制是禁用的(SBC=0),这时在发送数据寄存器中有数据(TXE=0)时被主机寻址(ADDR=1),可以选择将I2Cx_TXDR寄存器中的内容作为第一个数据字节发送出去,也可以将TXE位置1清空I2Cx_TXDR寄存器以便写一个新的数据字节并进行发送。但在从机字节控制模式(SBC=1)下,对于发送字节的数量有严格要求,待发送的字节数必须在地址匹配(ADDR=1)中断服务程序中写入到NBYTES位域中,传输过程中的TXIS事件个数与NBYTES中写入的值对应。
另外,当时钟延长被禁止(NOSTRETCH=1)时,SCL时钟在ADDR标志置位(从机被寻址)的时候无法等待从机在ADDR中断子程序中将第一个待发送的数据字节写入到I2Cx_TXDR寄存器中,要发送该数据字节,必须在从机被寻址之前预先写到I2Cx_TXDR寄存器中。
从机被寻址并发送应答位后,按接收到的R/W位的状态自动转入发送状态,并将保存在TXDR寄存器中的数据送入移位寄存器中开始发送,如果移位寄存器中没有数据,就将时钟延长以等待数据的到来,如果从机禁用时钟延长,将置位相关的错误中断标志位并交由软件进行干预。
·从机发送实例一(禁用时钟延长)
在禁用时钟延长的情况下从机发送数据的过程如图16-10所示。在从机完成初始化且没有被寻址之前,软件将待发送的数据字节1写入TXDR寄存器中(EV1)。当从机被寻址后自动发送应答位并转为从机发送模式,保存在TXDR寄存器中的数据字节1转移至移位寄存器中,此时TXE位和TXIS位均置位,表明TXDR为空且第一字节已经开始发送。在字节1发送过程中,软件再次将字节2写入TXDR寄存器中(EV2),每收到一个应答位,TXE位和TXIS位都将置位,当从机接收到来自主机的非应答信号后,先前已经写入到TXDR寄存器中的数据将不再保存至移位寄存器,TXE位和TXIS位也将不会置位,本次数据传输在主机产生的停止条件后结束。

使能时钟延长的从机发送过程如图16-11所示。在从机没有被寻址之前,发送数据1已经写入TXDR寄存器中,当从机被寻址后ADDR标志位置1,此时时钟延长开启以等待从机做相应的软件处理,之后软件置位ADDRCF位以清除ADDR标志(EV1)。该清除操作将使从机自发送一个应答位,表示从机已准备好进行下一步操作,同时将写入TXDR寄存器中的字节1移送至移位寄存器中开始发送。当字节2发送完毕并接收到来处主机的应答位后,待发送的字节3未及时写入TXDR中,这时从机又会再次拉低SCL线,直至将字节3写入TXDR中。同样当从机收到非应答信号时,TXIS位不再置位且保存至TXDR寄存器中的字节4也不能被发送。
在从机被寻址后,在软件清除ADDR位之前,可以将TXE位置位以清空TXDR寄存器。当从机发送应答位后,TXDR寄存器为空,这会导致TXIS位置位,从机再次将SCL线拉低,以等待数据的写入。本例与之前的不同之处在于从机被寻址后对TXDR进行了一次清除操作。具体传输过程如图16-12所示。
16.2.4 从机接收
相对于从机发送,接收的过程显得非常简单。在从机被寻址后,可以软件读取I2C_ISR寄存器的ADDCODE位和DIR位,并设置I2C_ICR寄存器的ADDRCF位以清除ADDR位,按照寻址字节方向位的设置,从机自动转入接收模式。当I2Cx_ISR寄存器的RXNE置位时,表示I2Cx_RXDR中已经保存有接收到的数据,如果I2Cx_CR1寄存器的RXIE为1则会产生一个中断。在读取I2Cx_RXDR寄存器后RXNE位被清除。当从机收到一个停止条件,并且I2Cx_CR1的STOPIE被置1,I2Cx_ISR寄存器的STOPF位会被置1并产生中断。使能时钟延长时的从机接收流程如图16-13所示。


·从机接收实例一(使能时钟延长)
在允许时钟延长的情况下,从机接收数据的过程如图16-14所示。当ADDR位置位后,时钟延长被使能,这时从机可以读取I2C_ISR寄存器的ADDCODE位和DIR位用于相关处理,之后软件设置I2C_ICR寄存器的ADDRCF位以清除ADDR位,从机自动转入接收状态。从机每接收到一个数据字节,RXNE位都会置位,读取RXDR寄存器可以清除RXNE位,当接收到的数据没有及时读取时,从机时钟延长会使能。

·从机接收实例二(禁用时钟延长)
在禁用时钟延长的情况下,从机接收数据的过程如图16-15所示。与上述示例不同的是,禁用时钟延长后,接收到的数据需及时读取,否则会发生数据溢出错误。

16.3 I2C主模式
默认情况下I2C模块工作在从机模式,当通过设置I2C_CR2寄存器的START位在总线上产生起始条件后,器件就进入到主机模式。这时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。
为了启动通信,必须在I2Cx_CR2寄存器中设置从机地址参数,具体包括地址模式(7位或10位)、要发送的从机地址(SADD[9:0])、传输方向(RD_WRN)、是否使用10位地址读(HEAD10R)以及要传输的字节数(NBYTES[7:0])等。当以上参数配置完成后,可以软件设置I2Cx_CR2寄存器的START位,这时I2C接口只要检测到总线空闲,将自动发送起始条件并在总线仲裁成功后获得总线的控制权。
16.3.1 主机接收
在7位地址模式时的主机接收时序如图16-16所示。主机首先发送一个地址字节(R/W=1),从机在接收到主机的寻址后产生一个应答信号,并将数据输出至总线上,主机每接收到一个数据都会发送一个应答信号。数据发送完成后,主机通过设置STOP位产生一个停止条件结束本次通信。

当使用10位地址时,寻址字节由7位地址时的1个变为2个,10位地址的读序列如下。
1.10位地址完整读序列(HEAD10R=0)
主机自动发送一个完整的读序列,这个序列包括“(Re)Start+从机地址10位头的写操作+从机地址的第二字节+ReStart+从机地址10位头的读操作”。在主机读模式下(RD_WRN位置1)且HEAD10R位清0时,将主机的START位置1后,会自动发送一个完整的10位地址读序列,具体如图16-17所示。

2.10位地址头只读序列(HEAD10R=1)
在主机读模式(RD_WRN位置1)且HEAD10R位置1时,将主机的START位置1后,将会只发送一个“ReStart+从机地址10位头的读操作”序列。这种方法不能单独使用,而应当建立在前期在主机写模式(RD_WRN位清0)时,主机已经向从机寻址并写入若干信息的基础上,而且两次在对从机的寻址间不能有停止条件出现。从器件在接收到上述序列后,开始输出自身数据,具体过程如图16-18所示。这种方法非常适用于对某一个I2C存储器件的读取。可以先将从器件的存储器单元地址写入,之后仅发送一个“从机地址10位头的读操作”,即可开始从指定地址单元读取信息。

主机接收时,在每字节接收完毕后的第8个SCL时钟脉冲期间,RXNE标志会硬件置1。如果I2Cx_CR1寄存器的RXIE位为1,则会产生中断。当软件读取I2Cx_RXDR寄存器时RXNE位会被硬件清零。
默认情况下,主机接收的字节数由NBYTES位域指定,总数不应大于255(RELOAD=0)。当NBYTES个数据已传输完成后,如果工作在自动结束模式下(AUTOEND=1),主机在收到最后一字节后会自动发送NACK和一个STOP条件;而如果工作在软件结束模式下(AUTOEND=0),在收到最后一字节后会自动发送一个NACK,TC标志会硬件置位,SCL线被拉低,这时可以软件发送START或STOP条件,并且这两种操作都将会清除TC标志;如果数据要接收的字节数大于255,必须选择重加载模式(RELOAD=1)。当NBYTES字节传输完成后,TCR标志被置位,SCL线被拉低直至NBYTES中被写入一个非零值。
·主机接收实例一(自动结束模式)
主机在自动结束模式下接收两字节的过程如图16-19所示。主机在初始化过程中,已将从机地址、待传送的字节数(设置为2字节)设置完毕,并且设置主机字节接收完成后为自动结束模式。初始化完成后,主机发送起始条件,并跟随从机地址,从机在被寻址后发送一个应答位响应,并随即将第一字节发送到总线上供主机读取。主机在成功读取到从机发送的字节后,RXNE位会置位,并自动发送一个应答位在总线上,软件读取RXDR寄存器后RXNE位硬件清零(EV1),当主机接收到第二字节后,将不再发送应答位,而是发送一个非应答位,用于通知从机结束发送数据,之后主机将自动发送一个停止位以结束本次传输。

·主机接收实例二(软件结束模式)
软件结束模式下接收数据的过程与自动结束模式大体相同,只是在接收到从机发送的最后一字节后,在RXNE位置位的同时,传输完成标志位TC也会置位,这时可以软件决定下一步是发送重复起始条件重启数据传输还是发送停止条件结束本次传输,很明显图16-20中选择的是前者。

16.3.2 主机发送
在7位地址模式时,主机首先发送一个地址字节(R/W=0),之后软件控制将数据依次发送至从器件,从器件每接收到一个信息后都会产生一个应答信号,当主机数据发送完成后,通过设置STOP位产生一个停止条件结束本次通信,主机发送的过程如图16-21所示。

在10位地址模式时,主机首先发送一个头字节,之后发送第二个地址字节,然后依次发送数据字节,从器件每接收到一个信息后都会产生一个应答信号。当主机数据发送完毕后,通过设置STOP位产生一个停止条件,具体过程如图16-22所示。
在主机发送情况下,每字节发送完之后,TXIS标志会硬件置1,并且主机在第9个SCL时钟脉冲时会收到一个来自从机的应答信号(ACK),如果I2Cx_CR1寄存器的TXIE位为1,则会产生中断,向I2Cx_TXDR寄存器写入待发送的数据时,TXIS标志位会被清除。
在数据传输过程中,TXIS事件的个数与NBYTES位域中写入的值相对应。当I2C工作在非重加载模式(RELOAD=0)且NBYTES个数据已传输完毕后,如果设置为自动结束模式(AUTOEND=1),主机会自动发送一个STOP条件;而当设置为软件结束模式(AUTOEND=0)时,传输完毕后TC标志会硬件置位,这时可以软件设置START位或STOP位来发送重复起始条件或停止条件。如果要发送数据的字节总数大于255,必须将I2Cx_CR2寄存器的RELOAD位置1以选择重加载模式。当发送了NBYTES字节之后,TCR(发送完毕自动重装)标志被置位,SCL线被拉低,NBYTES中的数据会被重新装载。
·主机发送实例一(自动结束模式)
在自动结束模式下,主机发送两字节的过程如图16-23所示。主机在初始化过程中,已经完成了对从机地址、传送的字节数(编程为2字节)的设置,并将I2C模块设置为自动结束模式。之后主机发送一个起始条件和从机地址以启动本次数据传输,从机在成功被寻址后发送一个应答位,主机接收到此应答位后将TXIS位置位。由于此时TXDR寄存器中并没有写入待发送的数据,所以主机将SCL线拉低以等待数据,直至软件将数据写入TXDR寄存器后,SCL线上的时钟延长随即停止,TXIS位清除。写入TXDR寄存器中的数据立即转移至移位寄存器中进行发送,同时TXIS位将会再次置位。当两字节发送完毕后,主机发送一个停止条件结束本次数据传输。

·主机发送实例二(软件结束模式)
在软件结束模式下,数据传输完毕后,TC标志位置位,这时可以软件决定发送停止条件结束本次传输还是发送重复起始条件重启数据传输。软件结束模式通信过程如图16-24所示。

更多推荐



所有评论(0)