Menu Close

RISC-V I2C中断设计与应用(1)I2C简介和设计

1. I2C简介

 

相关参考文章:

RISC-V教学教案

 

PRX100-D开发板载AT24C02的EEPROM芯片,I2C总线的测试主要是该设备的读写。AT24C02的datasheet参考这里。AT24C02设备的I2C地址为7’1010_000,详细信息参考原理图。在进入RISC-V I2C中断设计之前,这里先简单介绍一下I2C总线。

I2C(Inter-Integrated Circuit)是同步,多主多从的串行通信总线。它原由Philip公司发明,后由NXP半导体公司维护。I2C主要用于板内短距离的慢速外设和处理器之间的交流。

更多关于I2C的背景知识及基本功能实现参见:

 

2. RISC-V I2C设计

这里在原本流水线RISC-V CPU(V2.03之后的版本)的基础上新添加了一个I2C外设模块,作为I2C0模块,并将其中断i2c0_irq输出,连接到外部平台级中断处理器统一仲裁处理。

2.1. RISC-V I2C0模块设计概述

  • Standard Mode/低速模式,速度小于等于100 kbits/s
  • 支持byte写,page(对于AT24C02,page最大为8 bytes)写
  • 支持当前地址读,随机读(假写,dummy write),顺序读
  • 支持从机无应答中断
  • 支持写数据计数错误中断
  • 支持可编程读,写水印中断
  • 可通过软件写寄存器DIV,控制传输速率

 

RISC-V I2C0支持的五种读写模式示意图如下:

  • Byte写

图1所示为byte写,即在单次操作内(start和stop区间内),只有一个byte数据的写操作。可以看到主机发送设备地址+写位,主机发送寄存器地址,主机发送一个byte的数据。

byte写

图1 Byte 写 [1]

 

  • Page写

图2为page写,对于AT24C02来说,page写最多可以写8个byte的数据,并且需要是以8字节对齐的寄存器地址,即只能是0xX00xX8的寄存器地址(比如0xe8)开始才能写进完整的8-byte数据。根据AT24C02的datasheet,如果在不是8字节对齐的地址写入8 byte数据(或者是超过剩下对齐地址长度),顺序写下后,超出该8字节对齐地址的数据被卷回覆盖到对齐地址的开头。举例说明为,如果在0x07的地址写入3 byte数据(0x01,0x02,0x03),最终写操作完成的不是 0x07–0x01,0x08–0x02,0x09-0x03,而是0x07--0x01,0x00–0x02,0x01-0x03。上例中0x07处于对齐地址0x00-0x07中。之所以写操作有这个限制是因为AT24C02内部的寄存器随着写操作只会有低三位增加(即寄存器的低三位在单次page写操作时只能从3‘b000变化为3’b111,在16进制时最低位在单次page写操作内表现为只能在0x0-0x7,0x8-0xf范围内变化)。这个限制可以由软件特定的函数解决,在软件中,多于8-byte的写,或者是多于对齐地址剩下空间的写,被软件分割成AT24C02能接受的page写,并重复直到数据全部被写进EEPROM。

page写

图2 Page写 [1]

 

  • 当前地址读

当前地址读比较简单,如图3所示,主机只发送了设备地址+读位。在不发送寄存器地址的情况下,上一次操作的寄存器地址+1,即是当前地址读的寄存器。之后从机发给主机一个byte数据。

当前地址读

图3 当前地址读 [1]

 

  • 随机读

图4为随机读操作,其中包括一次假写(dummy write)。假写包括主机发送设备地址+位,主机发送寄存器地址。假写后,主机重新发送start位,并发送设备地址+位。从机回复主机一个byte的数据。随机读可以通过假写的寄存器定位到任意地址去读数据,所以被称为“随机读”。

随机读

图4 随机读 [1]

 

  • 连续读

连续读可以由随机读或者当前地址读扩展成多数据byte读,见图5所示。只要主机给从机回复ACK,那么从机就可以一直发送数据。如果寄存器地址为0xff,下一次地址+1 会回卷到0x00寄存器地址继续读。

连续读

图5 连续读 [1]

 

2.2. 地址图

I2C0的寄存器基地址为0xf000_4000,详细地址图点击这里

地址图

图6 I2C0寄存器地址

  • 版本寄存器

图7所示为I2C0模块的版本寄存器,只可读。

I2C0版本寄存器

图7 版本寄存器

 

  • SLAVE地址寄存器

图8为slave地址寄存器,可读可写。bit 16-31为保留位。bit 15-8为从机的寄存器地址,bit 7-1为从机的设备地址。bit 0为指示读/写操作,与I2C协议一致,‘0’ 表示写操作,‘1’表示读操作。默认值为0x0000_00A0,即默认的从机为AT24C02(7‘b1010_000),默认为写操作,并且寄存器地址为0x00。

注意:从机的寄存器地址对于读操作不是必需的,和控制寄存器的restart位配合使用,如果restart位立起来,即随机读,否则为当前地址读。

I2C0slave地址寄存器

图8 slave地址寄存器

 

  • 控制寄存器

图9为控制寄存器,可读可写。bit 31为整个I2C0模块的使能,‘1’ 为启动,‘0’为禁止。bit 30-9暂时保留。bit 8为restart,‘1’ 表示读/写操作需要增加寄存器地址(见slave地址寄存器bit 15-8),‘0’表示不用寄存器的读操作。bit 7 为reset,目前没有实现,暂时保留。bit 6-4 为可编程的读FIFO水印阈值,bit 3-1为可编程的写FIFP水印阈值。bit 0 为start位,该位控制I2C读写使能。在立起start位之前,需要确保写FIFO中的word count = I2C计数寄存器中的计数,如果不相等,可引起写数据计数错误中断。软件中,start位在最后一步设置,软件将start位立起来后,FPGA自动清零。默认值为0x0000_0000。

 

I2C0控制寄存器

图9 控制寄存器

  • 状态寄存器

图10所示为状态寄存器,只可读。bit 31-10为保留位。bit 9-6为读FIFO输出的word count。bit 5为读FIFO空。bit 4-1为写FIFO输出的word count。bit 0为写FIFO满。

I2C0状态寄存器

图10 状态寄存器

 

  • 写数据寄存器

图11为写数据寄存器,可读可写。bit 31-8为保留位。bit 7-0为写数据,以8比特/一个字节为最小单位。默认值为0x0000_0000。

I2C0写数据寄存器

图11 写数据寄存器

 

  • 读数据寄存器

图12为读数据寄存器,只可读。bit 31-8为保留位。bit 7-0为读数据,同样以8比特/一个字节为最小单位。

读数据寄存器

图12 读数据寄存器

 

  • 计数寄存器

图13为计数寄存器,可读可写。可编程,最大值为15 byte数据。在控制寄存器的start位立起来之前,需要确保写FIFO输出的word count和计数寄存器里的值相等,如果不相等,可引起写数据计数错误中断。

I2C0计数寄存器

图13 计数寄存器

 

  • 中断使能,悬挂和清除

图14为中断使能,悬挂和清除寄存器。中断悬挂寄存器只可读,中断使能和清除寄存器为可读可写。RISC-V I2C0支持4种中断:读水印中断,写水印中断,无应答中断和写数据计数错误中断。中断使能,悬挂和清除寄存器的bit 31-4都为保留位。中断寄存器的bit 3都是写数据计数错误中断,bit 2对应的是无应答中断,bit 1为读水印中断,bit 0为写水印中断。

当写FIFO输出的word count和计数寄存器里的值不相等时(比如I2C0计数寄存器被配置为8 byte,但是实际上写入FIFO的数据只有7个byte),derror被立起来。当从机无应答,不发送ACK时,nack被立起来。当读FIFO中的数据严格大于控制寄存器的读水印中的阈值时,rwm被立起来。当数据少于阈值时,相应的悬挂位被清除。当写FIFO中的数据严格小于控制寄存器的写水印中的阈值时,wwm被立起来。当数据超过阈值时,相应的悬挂位被清除。软件将中断清除的位立起来后,硬件会自动清零,确保软件写入一次中断清除寄存器只对应清除一次中断悬挂。

中断使能和清除寄存器的默认值都为0x0000_0000。

I2C0中断寄存器

图14 中断使能,悬挂和清除寄存器

 

  • DIV时钟分频

时钟分频寄存器如图15所示。Div计算公式为(fin / F)- 1。fin为FPGA的系统时钟主频,F为目标传输频率。DIV寄存器中的bit 31-16为保留位,bit 15-0是真正写入的分频除数。用这里使用的100 kbits/s传输速率和50 MHz主频为例,DIV计算出来的结果为499(100k = 50M/(DIV + 1),DIV = 499)。时钟分频寄存器的默认值为0x0000_2000(计算出来的目标传输频率远远小于100 kbits/s)。

I2C0分频计数器

图15 时钟分频寄存器

 

3. 文章参考

[1] Ww1.microchip.com, 2021. [Online]. Available: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8871F-SEEPROM-AT24C01D-02D-Datasheet.pdf. [Accessed: 19- May- 2021].

Posted in RISC-V, RISC-V 外设, RISC-V 教案, 应用开发, 教材与教案, 文章

发表评论

相关链接