[X]关闭

驱动之IIC概念总结

文档创建者:ぉ沙皮狗的忧伤
浏览次数:4965
最后更新:2019-11-29
本帖最后由 ぉ沙皮狗的忧伤 于 2019-11-29 10:07 编辑

一、概念   (1)、介绍
        时钟频率范围0~400Khz
          主模式下只有先将地址写入地址寄存器才能进行传输, I2C地址寄存器。处理器通过一个数据中断或一个传输完全中断来通知任何可用的接收数据。如果设置了保持位,I2C接口将在数据传输到支持慢速处理器服务之后保持SCL线路较低。主程序可以使用普通(7位)寻址和扩展(10位)寻址模式,在从监视器模式下,将I2C接口设置为主机,并继续尝试向其传输数据一个特定的从属设备,直到从属设备响应ACK。持有位可以设置为阻止主进程继续进行传输,从而防止an从机中的溢出状态。主模式和从模式之间的一个共同特征是超时(TO)中断标志。如果在任何点SCL线被访问的主从保持在低位超过指定的时间,在超时寄存器中,将生成一个超时(TO)中断,以避免出现停机情况。


           (2)、特性
                    PS支持两个具有以下关键特性的I2C设备:
                    •I2C总线规范版本2
                    支持16字节FIFO
                    可编程的正常和快速总线数据率
                    •主模式
                             写转让
                            读转移
                            扩展地址支持
                            支持慢速处理器服务
                            支持中断标志,避免失速
                    从监控模式


   (3)、12C模块的系统视点图
                file:///C:/Users/chenwei/AppData/Local/Temp/enhtmlclip/Image.png
    截图201911290954108044..png



  (4)功能框图

    截图201911290954348309..png
                                     file:///C:/Users/chenwei/AppData/Local/Temp/enhtmlclip/Image(1).png




     a、主机模式
            ①、写模式
            写数据执行以下步骤:
           1. 写入控制寄存器以设置SCL速度和寻址模式。
           2. 设置MS、ACKEN和CLR FIFO位,清除控制寄存器中的RW位。
           3. 如果需要,设置保持位。否则,将数据的第一个字节写入I2C数据寄存器。
           4. 将从属地址写入I2C地址列。这将启动I2C传输
           5. 通过向I2C数据寄存器写入数据来继续加载要发送给从机的剩余数据。每次主机写入I2C数据寄存器时,数据都被推送到FIFO中。当所有数据传输成功后,在中断状态寄存器中设置COMP位。当FIFC中只剩下两个字节可以传输时,就会产生一个数据中断当所有数据传输成功时,如果未设置持有位,I2C接口将生成停止条件并终止传输。如果保持位被设置,I2C接口保持SCL行低


          在数据传输之后。通过传输完全中断(COMP位集)通知主机此事件,并且清除状态寄存器中的TXDV位。此时,主机可以通过三种方式继续:
             1. 清除HOLD位,这将导致I2C接口生成STOP条件
             2. 通过写入I2C地址寄存器来提供更多的数据。这将导致I2C接口继续进行传输,将更多的数据写入从服务器如果在任何点上从机响应一个NACK,传输将自动终止,并产生一个transfe NACK中断(设置NACK位)。当接收到一个NACK时,传输大小寄存器表示仍然需要发送的字节数减去1。除非主机写入FIFO的最后一个字节是NACK字节,否则TXDV仍然保持高位。在这种情况下,主机必须通过在控制寄存器中设置CLR FIFO位来清除FIFO如果在任何时候,SCL行被主进程或被访问的从进程保持在较低的位置超过超时寄存器中指定的时间,就会产生一个中断,然后从传输大小寄存器中读取未完成的数据量减1










        ②、读模式
      读数据执行以下步骤:
         1. 写控制请求,设置SCL速度和寻址模式。
         2. 在控制寄存器中设置MS、ACKEN、CLR FIFO位和RW位。
         3. 如果主机希望在接收到数据后保持总线,它还必须设置保持位。
         4. 在传输大小寄存器中写入请求的字节数。
         5. 在I2C地址寄存器中写入从地址。



     这就启动了I2C传输,任何可用的接收数据都会以两种方式通知主机:
        1. 如果未完成的传输大小大于FIFO大小-2,那么当FIFO中有两个可用的空闲位置时,就会生成一个数据中断(数据位集)。
        2. 如果未完成的传输大小小于FIFO大小-2,当接收到未完成的传输大小字节时,将生成一个传输完全中断(COMP位集).


     在这两种情况下。设置状态寄存器中的RXDV位。
         I2C接口在接收到最后一个预期字节后自动返回一个NACK,并通过生成一个STOP条件来终止传输。如果在主读传输期间设置了保持位,则I2C接口将SCL线压低。

         如果在任何时候,当主机传输一个从地址读转移时,从机用NACK回应,转移自动终止并且一个转移NACK中断被产生(NACK位被设定)。可以从传输大小寄存器中读取未完成的数据量。

         如果在任何时候,主服务器或被访问的从服务器将SCL保持在低位的时间超过了超时寄存器中指定的时间,就会生成一个中断




    b、监控模式
       只有当模块处于主模式,并且设置了控制寄存器中的位SLVMON时,这种模式才有意义。

       主机必须设置MS和SLVMON位,并清除控制寄存器中的RW位。此外,它必须初始化从监视器暂停寄存器。每当主机写入12C地址寄存器时,主机尝试向特定的从机进行传输。如果从进程在收到地址时返回一个NACK,那么主进程将等待从进程监视器Pause寄存器所建立的时间间隔,并尝试对从进程aqain进行寻址。主机继续这个cvcle直到从机回应一个ACK到它的地址或直到主机清除控制寄存器中的SLVMON位。如果所寻址的从属服务器使用ACK响应,则I2C接口通过生成停止条件和SLV_RDY中断来终止传输。

   c、从机模式
通过清除控制寄存器中的MS位,将I2C接口设置为从接口。必须通过向I2C地址寄存器写入一个唯一的标识地址来给I2C从属地址。标准及校正实验所的速度,也必须至少设定为最快的标准及校正实验所预期的频率。当处于从模式时,I2C接口作为从发射机或从接收机工作。


    从机发射机
       从机在识别出主机发送的整个从机地址后,当最后一个发送地址字节的R/W字段高时,从机成为一个发送器。这意味着从机被请求通过12C总线发送数据,主机通过一个中断被通知给GIC(参见Fiqure 20-1,第606页)。与此同时,SCL线保持低位,以便在I2C主机开始对SDA线进行采样之前,允许主机向12C从服务器提供数据。通过设置数据中断标志来通知主机这个事件与此同时,SCL线保持低位,以便在I2C主机开始对SDA线进行采样之前,允许主机向12C从机提供数据。主机必须提供通过I2C数据寄存器进行传输的数据,以便SCL线路能够继续传输。如果在超时时间到期之前它没有写入I2C数据寄存器,就会生成一个中断并设置一个to interrupt标志。在主机写入I2C数据寄存器之后,在传输过程中通过在FIFO中加载数据继续传输。FIFO中加载的数据量可以是已知的系统参数,也可以通过使用I2C总线的高级协议提前进行通信。当只剩下两个有效字节了FIFO的传播,产生一个中断和数据中断flaq设置。如果I2C掌握返回纳最后一个字节传输从FIFO,产生一个中断,COMP中断标志设置一旦I2c主产生一个停止条件。如果主进程确认从FIFO发出的最后一个字节,则传输必须继续。此时,数据中断标志被设置。状态寄存器中的TXDV flaq被清除,因为FIFO是空的。如果I2C主机在从机发送FIFO中的所有数据之前终止传输,则通知主机,设置NACK中断标志,TXDV保持设置,传输大小寄存器指示FIFO中剩余的bvte。主机必须在控制寄存器中设置CIR FIFO位来清除FIFO和TXDV位。




   从机接收机
     当第一个地址字节的R/W位低时,从地址识别出主地址发送的整个从地址后,从地址成为接收器。这意味着主服务器将通过I2C总线向从服务器发送一个或多个数据字节。当一个字节被I2C从机确认后,状态寄存器中的RXDV位就被设置好了,这表明已经收到了新的数据。主机通过I2C数据寄存器读取接收到的数据。当FIFO中只剩下两个空闲位置时,将生成Ar中断并设置数据中断标志每当I2C主机产生一个停止条件时,就会产生一个中断,并设置COMP中断标志。然后,传输大小寄存器包含FIFO中可用的接收字节数。这个数字在每次读取I2C数据寄存器时由主机递减。如果I2C接口接收到一个或多个字节时FIFO已满,则会生成一个中断并设置RX OVF中断标志。当在合理的时间内无法响应中断时,可以在控制寄存器中设置HOLD位以避免溢出情况。如果设置了HOLD位,那么I2C接口将使SCL行保持低位,直到主机清除用于数据接收的资源。这将阻止主进程继续执行传输,从而导致从进程中出现溢出情况。主机通过读取数据寄存器清除数据接收的资源。如果设置了HOLD位,并且I2C接口将SCL保持在较低水平的时间长于超时时间,则会生成一个中断,并设置TO interrupt标志。



            
               
  (5)I2C速度
       I2C接口中使用的主时钟是时钟启用信号(参见Fiqure 20-3)。
          ·从机,时钟启用用于提取同步信息,以便对SDA线路进行正确的采样。
          ·主机,时钟使能被用来建立一个时基来产生所需的SCL频率
      file:///C:/Users/chenwei/AppData/Local/Temp/enhtmlclip/Image(2).png
      截图201911290955034481..png



       clock_enable信号的频率由CPU_1x时钟的频率和divisor_a和divisor_b的值定义,使用公式20-1

    截图201911290955404440..png
       file:///C:/Users/chenwei/AppData/Local/Temp/enhtmlclip/Image(3).png




    (6)启动顺序
             1. 复位控制器:编程复位见第20.4.2节复位控制器。
             2. 配置I/O信号路由:12C信号SCL和SDA可以路由到MIO或EMIO。见表20-4。章节中提供了I2C SCL和SDA信号路由到MIO的例子20.5.1销编程
             3. 配置时钟:I2C时钟体系结构在第20.4.1节中进行了描述
             4. 控制器配置:使用I2C程序实现I2C参数的传输。Control_reg0等等。请参阅第20.4.2节复位控制器
             5. 配置中断:中断有助于在FIFO中控制数据。参见20.2.8节状态和中断以及20.3.3节Confiqure中断中的编程示例
             6. 数据传输:在主模式和从监控模式下的传输可参考章节20.3.4数据传输。






         控制器配置
           用户应选择接口模式、寻址模式、传输方向、超时,并在启动I2C传输之前对I2C总线速度进行编程。可选地,如果需要,用户可以清除fifo并保持总线,以防大数据或合并传输
           例子:主写转移
              1. 配置控制参数,把0x0000_324E写入I2C.Control_reg0寄存器
                 a.选择主模式:设置i2c.Control_reg0[MS]= 1。
                b.设置传送方向为主机发射机:设置i2c.Control_reg0[RW] = 0。
                c.选择普通寻址[7位]模式:设置i2c.Control_reg0 [NEA] = 1。
                d.开启ACK传输:设置i2c.Control_reg0 [ACKEN] = 1
                e.清除FIFOs:设置i2c.Control_req0[CLR-FIFOI] = 1
                f.编写时钟除数程序
                   - Set i2c.Control_reg0[divisor_a] = 0.
                    - Set i2c.Control_reg0[divisor_b] = 50
                 这些除法器使用111 MHz的CPU 1X时钟生成99 KHz的I2C SCL时钟频率。有关详细信息,请参阅第 20.2.5 I2C Speed
           2. Confiqure  Timeout 向i2cTime_out_reg0寄存器写入0x0000_00FF。当SCL处于低位时,等待255个SCL周期,然后生成超时中断。






       (7)配置中断
            在第20.2.8节中描述了状态和中断,i2c.Intrpt_enable_reg0注册,具有位来启动中断掩码和I2C,可以强制禁用位中断,每一对位应设置互斥,   
                                
             示例:配置完成中断的程序示例
                 1. 启用完成中断。设置启用位,清除禁用位,验证掩码值:
                    a.设置i2c.Intrptenable_reg0 [COMP] = 1。
                    b.清除i2cIntrpt_disable_rego[COMP] = 0。
                    c. i2c.intrpt_mask_regO[COMP]读入= 1。
                 2. 禁用完成中断。设置启用位,清除禁用位,验证掩码值:
                    a.设置i2c.Intrptenable_reg0 [COMP] = 1。
                    b.清除i2cIntrpt_disable_rego[COMP] = 0。
                    c. i2c.intrpt_mask_regO[COMP]读入= 0。
                   3.监督完成中断。 i2c.Interrupt_status_reg0 [COMP]. 1通知中断发生。
                   4. 明确完成中断。写1到i2c.Interrupt_status_reg0[COMP]



               截图201911290956067216..png
               截图201911290956358350..png


               截图201911290957033659..png

                截图201911290957303714..png

                截图201911290957505065..png








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

本版积分规则