基于APB与I2C的多主多从架构设计
目录
- 1. Design Spec
- 1.1. Function Description
- 1.2. Feature List
- 1.3. Block Diagram
- i2c_top
- 1.4. Interface Description
- i2c_top
- i2c_reg
- i2c_trans
- 2. Design Flow
- 2.1. i2c_master
- 2.2. i2c_slave
- 2.3. i2c_cfg_reg
- 2.4. Test Bench
- 3. Verification
《 I2C-bus specification and user manual UM10204—4 April 2014》
《DesignWare DW_apb_i2c Databook - Synopsys》
I2C详解(一)
【数字IC】深入浅出理解I2C协议
I2C协议靠这16张图彻底搞懂(超详细)
I2C通信详解介绍(初学,浅显易懂,基本知识)
IIC、SPI、UART、USART、USB、CAN等通讯协议原理及区别
常用通信协议——IIC详解(全网最全)
集成电路总线(Inter-Integrated Circuit, I2C)
多路数据整形器(Multi Channel Data Formatter, MCDF)功能描述
1. Design Spec
1.1. Function Description
实现多主多从的I2C总线架构,波特率选择为 1Mbps,使用7bit寻址,具备通用广播、SCL同步、SDA仲裁功能。
1.2. Feature List
● 实现3主3从的I2C总线架构
● 可通过寄存器对I2C master的波特率进行配置,可配置成100kbps、400kbps、1Mbps、3.4Mbps四种模式
● 使用7bit寻址协议
● 具备通用广播、SCL同步、SDA仲裁机制
● 每个i2c设备的寄存器地址如下
Address | Register Name | Field(bits) | Type | Field Name | Default Value | Description |
---|---|---|---|---|---|---|
32'h0000_0000 32'h0000_0010 32'h0000_0020 32'h0000_0030 32'h0000_0040 32'h0000_0050 | Transmitter FIFO | [31:0] | W | 发送FIFO的写数据 | 32'd0 | 将在SDA上串行发送的并数据 |
32'h0000_0004 32'h0000_0014 32'h0000_0024 32'h0000_0034 32'h0000_0044 32'h0000_0054 | Receiver FIFO | [31:0] | R | 接收FIFO 读数据 | 32'd0 | 从SDA处串行接受的并数据 |
32'h0000_0008 32'h0000_0018 32'h0000_0028 32'h0000_0038 32'h0000_0048 32'h0000_0058 | Work Mode Config Register | [1:0] | RW | 工作模式控制 | 2‘d0 | 2'd0表示休眠状态不进行工作,2'd1表示作为slave,2'd2表示作为master,2‘d3保留 |
[3:2] | RW | 波特率控制 | 2‘d0 | 2'd0表示100kbps、2'd1表示400kbps、2'd2表示1Mbps、2'd3表示3.4Mbps | ||
[31:4] | RW | Reserved | 'd0 | 保留 |
注意I2C中SDA发送的数据均是在发送FIFO上取得的,每取一个数据发送一次,所以APB的paddr要是FIFO的地址而不是某个i2c slave某个寄存器的地址!!!!
1.3. Block Diagram
本文要实现的I2C总线架构如下图
i2c_top
每个i2c模块的框图如下
注意master要输出SCL但是并不能单独拉一个新的模块baud_clock_gen,这是因为I2C不是基于沿进行驱动和采样数据的,而是基于电平,后文会讲到
1.4. Interface Description
注意i2c_master与i2c_slave的设计相同,是根据寄存器配置成master模式或slave模式
i2c_top
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn | input | 1 | 复位信号 |
pclk | input | 1 | 用户时钟 |
paddr | input | PADDR_WIDTH | APB地址 |
pwrite | input | 1 | 1表示写,0表示读 |
psel | input | 1 | 选通 |
penable | input | 1 | APB使能 |
pwdata | input | PDATA_WIDTH | 写数据 |
prdata | input | PDATA_WIDTH | 读数据 |
pready | output | 1 | usart准备标志 |
scl | inout | 1 | I2C串行时钟总线 |
sda | inout | 1 | I2C串行数据总线 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
BAUD_RATE | bit per second | 设定的波特率 |
PCLK_FREQ | HZ | clk的时钟频率 |
PADDR_WIDTH | bit | 访问SPI内部FIFO的地址位宽 |
PDATA_WIDTH | bit | 写入or读出的数据位宽 |
FIFO_WRITE_WIDTH | bit | FIFO写深度 |
i2c_reg
Group | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
APB_intf | prstn | input | 1 | 复位信号 |
pclk | input | 1 | 用户时钟 | |
paddr | input | PADDR_WIDTH | APB地址 | |
pwrite | input | 1 | 1表示写,0表示读 | |
psel | input | 1 | 选通 | |
penable | input | 1 | APB使能 | |
pwdata | input | PDATA_WIDTH | 写数据 | |
prdata | input | PDATA_WIDTH | 读数据 | |
pready | output | 1 | usart准备标志 | |
reg_intf | tx_fifo_rd_en | input | 1 | TX FIFO 读使能 |
tx_fifo_rdata | output | 32 | TX FIFO 读数据 | |
tx_fifo_empty | output | 1 | TX FIFO 空标志 | |
rx_fifo_wr_en | input | 1 | RX FIFO 写使能 | |
rx_fifo_wdata | input | 32 | RX FIFO 写数据 | |
rx_fifo_full | output | 1 | RX FIFO 满标志 | |
work_mode | output | 32 | 工作模式配置寄存器 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
BAUD_RATE | bit per second | 设定的波特率 |
PCLK_FREQ | HZ | clk的时钟频率 |
PADDR_WIDTH | bit | 访问SPI内部FIFO的地址位宽 |
PDATA_WIDTH | bit | 写入or读出的数据位宽 |
FIFO_WRITE_WIDTH | bit | FIFO写深度 |
i2c_trans
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn | input | 1 | 复位信号 |
pclk | input | 1 | 用户时钟 |
paddr | input | PADDR_WIDTH | APB地址 |
pwrite | input | 1 | 1表示写,0表示读 |
psel | input | 1 | 选通 |
penable | input | 1 | APB使能 |
pwdata | input | PDATA_WIDTH | 写数据 |
prdata | input | PDATA_WIDTH | 读数据 |
pready | output | 1 | usart准备标志 |
scl | output/input | 1 | I2C串行时钟总线,master为output、slave为input |
sda | inout | 1 | I2C串行数据总线 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
BAUD_RATE | bit per second | 设定的波特率 |
PCLK_FREQ | HZ | clk的时钟频率 |
PADDR_WIDTH | bit | 访问SPI内部FIFO的地址位宽 |
PDATA_WIDTH | bit | 写入or读出的数据位宽 |
FIFO_WRITE_WIDTH | bit | FIFO写深度 |