当前位置: 首页 > news >正文

基于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_0050Transmitter 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_0054Receiver 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_0058Work Mode Config Register[1:0]RW工作模式控制2‘d02'd0表示休眠状态不进行工作,2'd1表示作为slave,2'd2表示作为master,2‘d3保留
[3:2]RW波特率控制2‘d02'd0表示100kbps、2'd1表示400kbps、2'd2表示1Mbps、2'd3表示3.4Mbps
[31:4]RWReserved'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
prstninput1复位信号
pclkinput1用户时钟
paddrinputPADDR_WIDTHAPB地址
pwriteinput11表示写,0表示读
pselinput1选通
penableinput1APB使能
pwdatainputPDATA_WIDTH写数据
prdatainputPDATA_WIDTH读数据
preadyoutput1usart准备标志
sclinout1I2C串行时钟总线
sdainout1I2C串行数据总线

之后是参数描述

Parameter Units Description
BAUD_RATEbit per second设定的波特率
PCLK_FREQHZclk的时钟频率
PADDR_WIDTHbit访问SPI内部FIFO的地址位宽
PDATA_WIDTHbit写入or读出的数据位宽
FIFO_WRITE_WIDTHbitFIFO写深度

i2c_reg

Group Signal Direction Width(bits) Description
APB_intfprstninput1复位信号
pclkinput1用户时钟
paddrinputPADDR_WIDTHAPB地址
pwriteinput11表示写,0表示读
pselinput1选通
penableinput1APB使能
pwdatainputPDATA_WIDTH写数据
prdatainputPDATA_WIDTH读数据
preadyoutput1usart准备标志
reg_intftx_fifo_rd_eninput1TX FIFO 读使能
tx_fifo_rdataoutput32TX FIFO 读数据
tx_fifo_emptyoutput1TX FIFO 空标志
rx_fifo_wr_eninput1RX FIFO 写使能
rx_fifo_wdatainput32RX FIFO 写数据
rx_fifo_fulloutput1RX FIFO 满标志
work_modeoutput32工作模式配置寄存器

之后是参数描述

Parameter Units Description
BAUD_RATEbit per second设定的波特率
PCLK_FREQHZclk的时钟频率
PADDR_WIDTHbit访问SPI内部FIFO的地址位宽
PDATA_WIDTHbit写入or读出的数据位宽
FIFO_WRITE_WIDTHbitFIFO写深度

i2c_trans

Signal Direction Width(bits) Description
prstninput1复位信号
pclkinput1用户时钟
paddrinputPADDR_WIDTHAPB地址
pwriteinput11表示写,0表示读
pselinput1选通
penableinput1APB使能
pwdatainputPDATA_WIDTH写数据
prdatainputPDATA_WIDTH读数据
preadyoutput1usart准备标志
scloutput/input1I2C串行时钟总线,master为output、slave为input
sdainout1I2C串行数据总线

之后是参数描述

Parameter Units Description
BAUD_RATEbit per second设定的波特率
PCLK_FREQHZclk的时钟频率
PADDR_WIDTHbit访问SPI内部FIFO的地址位宽
PDATA_WIDTHbit写入or读出的数据位宽
FIFO_WRITE_WIDTHbitFIFO写深度

2. Design Flow

2.1. i2c_master

2.2. i2c_slave

2.3. i2c_cfg_reg

2.4. Test Bench

3. Verification

相关文章:

  • Visual Studio Code 自动编译 TypeScript
  • 【智能合约】——智能合约安全指南
  • 三、git分支操作
  • 猿创征文|Python基础——Visual Studio版本——pytest
  • 第二十四篇:稳定性之多环境建设
  • 【RHCE-第三天作业】
  • elementUI时间选择器:TypeError: value.getHours is not a function
  • “蔚来杯“2022牛客暑期多校训练营5
  • MyBatis Plus (七) --------- 插件扩展
  • css基础总结(css简介、css语法框架、css样式表格式、css选择器)
  • 东芝推出第三代碳化硅MOSFET来提高工业设备效率
  • Zookeeper集群搭建
  • 基于SSM的校园运动会管理系统
  • javaweb基于html5旅游攻略管理系统ssh
  • 司空见惯 - 好吃的姑娘
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 3.7、@ResponseBody 和 @RestController
  • Create React App 使用
  • ES6系列(二)变量的解构赋值
  • js正则,这点儿就够用了
  • Logstash 参考指南(目录)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • SQLServer之创建数据库快照
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue.js-Day01
  • Vue2 SSR 的优化之旅
  • 从0实现一个tiny react(三)生命周期
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 一些关于Rust在2019年的思考
  • 优化 Vue 项目编译文件大小
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​Java并发新构件之Exchanger
  • #includecmath
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (python)数据结构---字典
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET gRPC 和RESTful简单对比
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net的socket示例
  • .NET下的多线程编程—1-线程机制概述
  • .net与java建立WebService再互相调用
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android] Amazon 的 android 音视频开发文档