FPGA构造IIC时序——switch1848为例

IIC时序图 主机读数据(接收)的时候,接收完一个字节,也就是8位接收完后,在SCL低电平时,拉高拉低SDA电平来作为应答位,拉低为0,应答,拉高为1,非应答,这里主机发应答位就不需要从机交出控制权哈,和上面不一样,直接就能控制SDA,可以说是,主机对SDA有绝对控制权。和上面过程类似,在主机控制的SCL低电平的时候,从机放数据在SDA,SCL高电平的时候,主机就读取从机控制的SDA的高低电平数据,总结:SCL低电平,从机控制SDA高低电平放数据,SCL高电平,主机读数据,循环8次,就接收一个字节。 阅读详情

一.对IIC的时序理解

       IIC接口是一种总线结构,只能有一个主控器件,挂在IIC的两根线上其余都为从器件。主控,发送数据和接收数据都由主器件控制。主控器件要遵从标准的IIC时序和从器件的芯片手册时序。标准的IIC时序的工作流程为:


       首先要发送数据,需要发送一个开始位,然后传送八位数据,从机在第九个时钟会回复一个应答信号主机可以选择继续发送数据和拉一个停止位。这是标准的IIC时序流程,这个时序还要和1848手册上的时序图做个对比。



       主机首先要发送一个起始位,然后发送要访问的7bits的设备ID,在1848电路中是由七个电阻上拉下拉决定ID值的,经过确认,ID值为1100000,但是一次要发送八个数据,最后bit是1就是读请求,0就是写请求。然后第九个时钟芯片在数据线SDA回复一个应答。然后发送24bit的要操作的寄存器值,每8bit从机都会回复一个ACK应答信号,发送完毕之后还要输入32bit的寄存器的数值随后接收应答之后,发送停止位。
       但是IIC时序,也有严格的时序要求。

开始位:


       开始位的时序要求为:在SCL高电平期间,主机将数据线拉低,拉低的整个过程称为IIC的起始位。

停止位:



停止位是SCL高电平器,将数据线拉高,这个拉高的过程称为停止位。

发送数据的时:



       发送数据,时钟沿的要求为,SCL高电平开始接收数据,在高电平达到之前,数据就要求稳定,在时钟SCL的低电平器件,允许数据线发生变化。
二.FPGA的原理设计
  1. 调用Ip核


       控制模块在调用此IP核的时候,需要先装填好所有要发送的值,然后启动一次写使能信号,根据1848手册,共需要写入8个8bit的数据(1的设备地址3个寄存器地址4个数据),所以每次装填好数据之后等待忙线,当检测到IIC总线不忙的时候再启动下一次的写。一共需要写入四套数据,每套是8个8bit的数据。

三.软件仿真测试
1.首先看发送数据的第一个起始位:

起始位在最初的时候scl是高,数据线被主机拉低。我发送的第一个是设备地址C0也就是
1100000 0,数据在SCL上升沿到来之前已经被赋值上,到第九个时钟三态门的dir是低准备接收应答。数值都是对的也是符合时序要求的
2.再看看停止位:

dir为低的时候是三态门方向,可以看到,dir为低接收应答之后,再SCL为高的时候,SDA也拉高。这就开启了停止位。代表一次传输的8个8bit传输结束。
3.总体来看:

busy信号共BUSY了四段每次都传输32个8bit.符合胡佳顺师兄给的寄存器的值,这32个8bit 是:
memory_initialization_radix=16;

memory_initialization_vector=c0 38 60 09 00 0000 09 c0 38 64 08 00 00 00 08 c0 00 00 97 d0 60 00 01 c0 00 00 9f d0 60 00 01;是和STM32发的值是一样的。而且软仿的时候我都是一个一个查的,时序是符合逻辑和满足要发的数据都是对。可以说明,保证FPGA是按时序输出的数据。
四.程序源码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: fzh
// 
// Create Date: 2018/01/23 20:34:23
// Design Name: 
// Module Name: iic_drive
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////




module iic_drive( 
input clk, 
input reset_n,


// 与控制器通信信号
input   [31:0]      slv_reg0,//地址


input   [31:0]      slv_reg1,//reg地址'
input   [31:0]      slv_reg1a,//reg地址'
input   [31:0]      slv_reg1b,//reg地址'


input   [31:0]      slv_reg2,//待发送的数据
input   [31:0]      slv_reg2a,//待发送的数据
input   [31:0]      slv_reg2b,//待发送的数据
input   [31:0]      slv_reg2c,//待发送的数据


input   [31:0]      slv_reg3,//写使能
input   [31:0]      slv_reg4,//读使能
output  reg [ 7:0]  iic_rddb,
output              iic_busy,


// 外部信号
output              iic_scl,
input               iic_sda_in,
output              sda_dir,
output              sda_r
);


//  SCL 分频系数
// 产生IIC时钟  100M/20K = 5000
parameter  SCL_SUM = 13'd500;


// 仿真时
//parameter  SCL_SUM = 13'd64;


//***************************************************************************************
// iic读写状态机


reg  [12:0]     scl_cnt;
always @ (posedge clk or negedge reset_n)
begin
    if(reset_n == 1'b0)
        scl_cnt <= 13'd0;
    else if(scl_cnt < (SCL_SUM - 1))
        scl_cnt <= scl_cnt + 1;
    else
        scl_cnt <= 13'd0;
end 




// 不同的时钟阶段
assign  iic_scl = (scl_cnt <= (SCL_SUM >> 1));                       // 初始为高电平
wire    scl_hs = (scl_cnt == 13'd1);                                // scl high start
wire    scl_hc = (scl_cnt == ((SCL_SUM >> 1)-(SCL_SUM >> 2)));      // scl high center
wire    scl_ls = (scl_cnt == (SCL_SUM >> 1));                       // scl low start
wire    scl_lc = (scl_cnt == ((SCL_SUM >> 1)+(SCL_SUM >> 2)));      // scl low center






//IIC状态机控
通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现) 通信协议详解(一):IIC总线协议(传输时序+数据格式+设计实现)IIC(是一种具有两线传输的串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机连接低速周边设备而发展,适用于数据量不大且传输距离短的场合。     IIC串行总线由两根信号线组成,一根是双向的数据线SDA,另一根是时钟线SC 阅读详情

相关推荐

IIC通讯协议详解(电路和时序图)

硬件电路设计 软件时序设计 1. 起始条件与终止条件 2. 发送与接收一个字节 3. 发送应答和接收应答 4. IIC时序 4.1 指定地址写 4.2 当前地址读 4.3 指定地址读

weixin_44115575的博客 3万+

低速通信接口(二)I2C

I2C

buzhiquxiang的博客 1115

FPGA实现IIC通信(读写EEPROM)

FPGA实现iic通信(读写EEPROM) 实验平台:正点原子ALIENTEK开拓者FPGA开发板 1. IIC协议简介 1.1 什么是IIC协议 IIC即为Inter-Inegrated Circuit(集成电路总线),在上世纪八十年代左右由Philips公司(即现做的NXP半导体公司)设计出来的一种简单、双向、二进制总线标准。其只需要两根线(SDA数据线和SCL时钟线)即可实现总线连接的器件间的通信。SDA和SCL都是双向I/O线,所以主要适用于数据量小,距离短的主从通信,数据的传输速率在标准模式下可达

xs_sd的博客 6845

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3080

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 508

【花雕学编程】Arduino动手做(249)---ESP32+GC9A01之播放GIF的空战锁定动画

摘要: 本实验基于ESP32开发板,驱动1.28寸圆形IPS彩色TFT显示屏(GC9A01驱动,240×240分辨率),通过SPI接口实现GIF动画播放。利用TFT_eSPI和AnimatedGIF库,成功加载并循环播放预置的科幻风格GIF动画(如HUD界面、X翼战机等)。代码实现了GIF解码、逐帧渲染及动态显示功能,通过串口调试监控运行状态。实验验证了该显示屏在动态图像显示中的流畅性,为嵌入式图形应用提供了实用方案,适用于智能穿戴、交互设备等场景。 关键词: ESP32、GC9A01、圆形TFT、GIF播

雕爷学编程 492

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

Unity接入抖音小程序侧边栏

Unity接入抖音小程序侧边栏功能实践总结 本文分享了Unity游戏接入抖音小程序侧边栏复访功能的实现过程。针对官方文档不清晰的问题,作者详细介绍了关键实现步骤:通过TT.CheckScene检测侧边栏可用性,利用OnShow事件监听判断用户是否从侧边栏进入,并提供了完整的UI交互代码示例。重点功能包括:检测宿主版本支持、区分侧边栏入口与非侧边栏入口的界面展示、实现跳转侧边栏场景等。文中附有官方文档链接和效果截图,为开发者提供了实用的接入参考方案。

类人_猿的博客 615

Chrome下载B站视频字幕的插件

本文主要介绍了Chrome下载B站视频字幕的插件,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

由Sensor光谱响应曲线联想到的白平衡增益计算

由Sensor光谱响应曲线联想到的白平衡增益计算 由于传感器硬件的限制,传感器在某个预定波长范围内的响应不可能是100% 响应。现实中都是类似于正态分布的单峰函数。如果仅做粗略计算,由一个中心波长和半高宽(也成半波宽)完全可以由数学公式计算出一个高斯分布曲线。这个分布曲线就叫波谱响应函数。 波谱响应函数反映了传感器通道获取能量的情况。实际上每个传感器厂商都提供了具体的光谱响应函数,一般由两列数据组成,一列数据是波长,另一列数据是相对响应强度。下图某sensor光谱的响应的波谱响应函数。 ...

大熊 7490

华为OD机考双机位C卷 - 区间交集(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 区间交集

算法大师! 1136

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: Xilinx DDR IP详解与时序分析
下一篇: xlinx_pcie_ip 使用笔记
fzhykx
博客等级 码龄9年 458粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值