iic通信控制的ad5259------在调试过程中遇到的奇葩问题

super_star123 super_star123     2022-11-16     687

关键词:

首先说一下的遇到的问题:

1.AD5259按照SCL是100KHz的情况下,可以正常接收上位机的数据,但是一段时间后,就不能正确的按照时序来走了

原因在于AD5259在接收到上位机的数据后需要一定的响应时间,而在这个响应时间内,scl和sda都不应该有任何的活动,否则会导致不能准确接收下一个数据的开始信号,但要特别注意的是,这段时间内的SCL以及SDA的设置也是有一个说法的。

2.断电后可以保持在正常工作的条件下。

断电相当于是一个复位的过程,也就是说,复位后可以正常工作~

3.网上找到的完整的IIC分析

IIC协议

??IIC协议是一种多机通讯,由SDA数据线和SCL时钟线构成串行总线,所有的IIC设备都可以挂载到总线上,但每个设备都有唯一的设备读地址和设备写地址。在使用IIC作为数字接口的芯片datasheet中都可以看到该设备的设备读/写地址情况,并可以查找到相应的读写时序,以及对速率的要求。下图是一个通用的IIC协议时序:

技术分享图片

 

我们可以总结出五种IIC协议的时序状态:
??1. 空闲状态,当SDA和SCL两条信号线都处于高电平时总线处于空闲状态。
??2. 开始信号,SCL为高电平期间SDA信号线上产生了下降沿标志着的一次数据传输的开始。开始信号应当由主机发起。
??3. 数据传输,在SCL同步控制下SDA串行的传送每一位,因此传送8bits的数据需要8个SCL时钟。SCL为高电平时期SDA电平状态必须稳定;SCL为低电平期间才允许SDA改变状态。
??4. 应答信号,IIC总线上每传送一个8位字节,第9个脉冲期间便会释放总线,由接收器发出一个应答信号,反馈有没有成功接收。
??5. 停止信号,在SCL保持高电平期间,将SDA信号线释放恢复到高电平,标志一次数据传输的结束,IIC总线也重新回到了空闲状态。

计数器控制IIC读写

??在“FPGA基础设计(三):UART串口通信”中已经接触到了使用计数器控制时序的方法,这个方法在控制IIC通信时同样实用。一次完整的写入操作如下所示:
case( i )
0: // iic Start
begin
isOut <= 1; //SDA端口输出

if( C1 == 0 ) rSCL <= 1‘b1;
else if( C1 == 200 ) rSCL <= 1‘b0; //SCL由高变低

if( C1 == 0 ) rSDA <= 1‘b1;
else if( C1 == 100 ) rSDA <= 1‘b0; //SDA先由高变低

if( C1 == 250 -1) begin C1 <= 9‘d0; i <= i + 1‘b1; end
else C1 <= C1 + 1‘b1;
end

1: // Write Device Addr
begin rData <= 4‘b1010, 3‘b000, 1‘b0; i <= 5‘d7; Go <= i + 1‘b1; end

2: // Wirte Word Addr
begin rData <= Addr_Sig; i <= 5‘d7; Go <= i + 1‘b1; end

3: // Write Data
begin rData <= WrData; i <= 5‘d7; Go <= i + 1‘b1; end

4: //iic Stop
begin
isOut <= 1‘b1;

if( C1 == 0 ) rSCL <= 1‘b0;
else if( C1 == 50 ) rSCL <= 1‘b1; //SCL先由低变高

if( C1 == 0 ) rSDA <= 1‘b0;
else if( C1 == 150 ) rSDA <= 1‘b1; //SDA由低变高

if( C1 == 250 -1 ) begin C1 <= 9‘d0; i <= i + 1‘b1; end
else C1 <= C1 + 1‘b1;
end

5:
begin isDone <= 1‘b1; i <= i + 1‘b1; end //写I2C 结束

6:
begin isDone <= 1‘b0; i <= 5‘d0; end

7,8,9,10,11,12,13,14: //发送Device Addr/Word Addr/Write Data
begin
isOut <= 1‘b1;
rSDA <= rData[14-i]; //高位先发送

if( C1 == 0 ) rSCL <= 1‘b0;
else if( C1 == 50 ) rSCL <= 1‘b1;
else if( C1 == 150 ) rSCL <= 1‘b0;

if( C1 == F250K -1 ) begin C1 <= 9‘d0; i <= i + 1‘b1; end
else C1 <= C1 + 1‘b1;
end

15: // waiting for acknowledge
begin
isOut <= 1‘b0; //SDA端口改为输入
if( C1 == 100 ) isAck <= SDA;

if( C1 == 0 ) rSCL <= 1‘b0;
else if( C1 == 50 ) rSCL <= 1‘b1;
else if( C1 == 150 ) rSCL <= 1‘b0;

if( C1 == F250K -1 ) begin C1 <= 9‘d0; i <= i + 1‘b1; end
else C1 <= C1 + 1‘b1;
end

16:
if( isAck != 0 ) i <= 5‘d0;
else i <= Go;

endcase

?向IIC总线写数据时,需要依次写入待写入的设备写地址、设备中的写地址和待写入的数据共3个8bits字节数据。i代表总线上不同的状态,通过计数器来控制状态之间的跳转。i为0时发出开始信号;i为7~14时控制8bits数据的发送;i为1、2、3时分别为设备地址、字节地址和数据,依次调用7-14完成数据的传输;其余还有停止位、应答位、IIC通信完成置位等状态。

??从器件中读取数据的方法与此一样,只不过通常都需要先向IIC总线写入待读取的设备地址和器件地址,之后再读数据。读数据整体过程比写数据要麻烦一点,但只要控制好状态之间跳转的过程即可。

分频时钟控制IIC读写

??由计数器控制通信时序的方法优点是很灵活,几乎所有的时序方法都可以用这种方法完成;缺点就是太麻烦,需要控制好状态之间的跳转,时序越复杂使用越麻烦,其实在“FPGA采集-传输-显示系统(二):基于FPGA的温度采集和以太网传输”中,我对DS18B20的时序控制就是采用计数器控制的方法。DS18B20的时序要求较多,因此其中的状态跳转已经相当复杂。

??其实在控制IIC这种时钟速率固定的串行协议时,还可以在外部分频或PLL生成一个低频的通信时钟,用这个时钟来控制数据传输过程。如下所示:
[email protected](posedge clock_i2c)
begin
if(reset_n==1‘b0) begin
tr_end<=0;
ack1<=1;
ack2<=1;
ack3<=1;
sclk<=1;
reg_sdat<=1;
end
else
case(cyc_count)
begin ack1<=1;ack2<=1;tr_end<=0;sclk<=1;reg_sdat<=1;end
reg_sdat<=0; //开始传输
sclk<=0;
reg_sdat<=i2c_data[23];
reg_sdat<=i2c_data[22];
reg_sdat<=i2c_data[21];
reg_sdat<=i2c_data[20];
reg_sdat<=i2c_data[19];
reg_sdat<=i2c_data[18];
reg_sdat<=i2c_data[17];
reg_sdat<=i2c_data[16];
reg_sdat<=1; //应答信号
begin reg_sdat<=i2c_data[15];ack1<=i2c_sdat;end
reg_sdat<=i2c_data[14];
reg_sdat<=i2c_data[13];
reg_sdat<=i2c_data[12];
reg_sdat<=i2c_data[11];
reg_sdat<=i2c_data[10];
reg_sdat<=i2c_data[9];
reg_sdat<=i2c_data[8];
reg_sdat<=1; //应答信号
begin reg_sdat<=i2c_data[7];ack2<=i2c_sdat;end
reg_sdat<=i2c_data[6];
reg_sdat<=i2c_data[5];
reg_sdat<=i2c_data[4];
reg_sdat<=i2c_data[3];
reg_sdat<=i2c_data[2];
reg_sdat<=i2c_data[1];
reg_sdat<=i2c_data[0];
reg_sdat<=1; //应答信号
begin ack3<=i2c_sdat;sclk<=0;reg_sdat<=0;end
sclk<=1;
begin reg_sdat<=1;tr_end<=1;end //IIC传输结束
endcase

 























































































使用gd32内嵌iic控制器

...用GD32内嵌IIC控制器,以中断方式,快速实现的IIC通信,速度400kbps。IIC通信,诸如常用的STM32,多是用IO口模拟IIC通信的。曾经以STM32内嵌IIC控制器,以中断方式,快速实现了IIC通信。实现的关键是1字节... 查看详情

半吊子的stm32—iic通信

 半双工通信模式;以字节模式发送(8位);两线式串行总线,SDA(数据信号)和SCL(时钟信号)两条信号线都为高电平时,总线为空闲状态;起始时,SCL稳定为高电平,SDA电平由高向低跳变;停止时,SCL高电平,SDA电平由... 查看详情

fpga基础设计:iic协议

...芯片(DDS、串行ADC、串行DAC)都是通过IIC总线来和控制器通信的。不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kbit/s。本文致力于讲述如何用计数器控制和分频时钟控制两种方式完成IIC的读写... 查看详情

通信协议:iic协议的原理和模拟iic的实现

...种两线制(SDL+SCL)的串行通行方式,它也是主从机之间通信的方式,在今天也是被广泛的应用在很多的产品设备上。使用IIC协议进行数据通信的设备,它既可以作为主机又可以作为从机(支持多主多从),并且它是一种半双工... 查看详情

iic通信时遇到问题的解决

  如果遇到问题,反复查不到 就DEBUG 下单点运行,执行每一个SCK和SDA的拉高拉低 看看是否能正常的拉高拉低 先解决掉底层的GPIO的控制问题, 有的时候可能数据引脚为特殊功能引脚 查看详情

iic协议学习笔记

...每个连接在总线上的设备都是通过唯一的地址和其他器件通信,主机和从机的角色可互换,  主机和从机的概念。主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指 查看详情

iic通信协议总结

前言最近在复习通信协议相关的知识,故此做个总结。概要IIC(IIC,inter-Integratedcircuit),两线式串行总线,用于MCU和外设间的通信。IIC为同步通信,同步通信要求发收双方具有同频同相的同步时钟信号,IIC... 查看详情

twincat3的基本功能

...可提供用于通讯链。ADS客户端在网络中可通过ADS与TwinCAT控制器连接。TC1100|TC3I/O:使用TwinCATI/O可以在过程映像中通过不同的现场总线采集循环数据。循环任务驱动相应的现场总线。不同的现场总线能够在同一个CPU上用不同的周期... 查看详情

泰凌微tlsr8359调试

刚刚到新公司不到一个月,主要调试了泰凌微TLSR8359芯片。以前从没有接触过STM32系列以外的芯片。第一次接触泰凌微有点手忙脚乱,第一周的工作基本无用,在第二周周一全部推翻从来。调试IIC时用的是GPIO模拟IIC,使用从前在3... 查看详情

iic通信协议总结

前言最近在复习通信协议相关的知识,故此做个总结。概要IIC(IIC,inter-Integratedcircuit),两线式串行总线,用于MCU和外设间的通信。IIC为同步通信,同步通信要求发收双方具有同频同相的同步时钟信号,IIC... 查看详情

通信协议之iic总线

...号和停止信号数据有效性地址及数据方向响应实例前言IIC通信协议是Philips公司开发的,由于其引脚少,硬件简单,无须收发设备,因此应用广泛。本文主要简单介绍一下IIC协议。本文主要参考一下资料:刘火... 查看详情

基于stm32f429的ads1115驱动程序(代码片段)

...fault&sxts=15579877809202.IIC协议程序IIC协议是大多数传感的通信协议,每个嵌入式工程师都要有自己的IIC底层协议IIC可细分为7个函数1.开始2.读取3.发送4. 查看详情

iic总线协议——esp32学习笔记

...协议——esp32学习笔记零、前言一、IIC总线二、IIC总线的通信过程1.主机发送起始信号启用总线2.主机发送一个字节数据指明从机地址和后续字节的传送方向3.被寻址的从机发送应答信号回应主机()4.发送器发送一个字节... 查看详情

调试一个socket通信bug的心理过程和反思

背景交代。最近在玩lua的服务端编码,有项目A,B,AB都是同一个模子的。我手上有A的winsocket客户端和服务端的代码,B项目早期的一份linux下的luaclient。服务端、客户端都是LUA。目标:调通B的client供我在Linux下对A做测试。顺便加... 查看详情

:iic(i2cinter-intergratedcircuit集成电路总线)iic时序图(iic协议)i2c模拟时序stm32f4xx的iic通信重载print

...   IIC时序图(IIC协议)三.   I2C模拟时序四、STM32F4XX的IIC通信五、重载printf()一.   IIC(I2CInter-IntergratedCircuit集成电路总线)  由Pillphs公司发明的。   IIC也是属于通信的一种,并且也是串行通信(按bit收发数据)。      IIC... 查看详情

31.硬件-iic

...原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。  2、IIC的物理层:    ①、只要求两条总线线路:串行数据线SDA,串行时... 查看详情

stm32第七章:iic(i2cinter-intergratedcircuit集成电路总线)iic时序图(iic协议)i2c模拟时序stm32f4xx的iic通信重载print

...   IIC时序图(IIC协议)三.   I2C模拟时序四、STM32F4XX的IIC通信五、重载printf()一.   IIC(I2CInter-IntergratedCircuit集成电路总线)  由Pillphs公司发明的。   IIC也是属于通信的一种,并且也是串行通信(按bit收发数据)。      IIC... 查看详情

7针oled屏幕使用iic接口

...阻或是用焊锡短接电阻两端。CS脚接地。DC脚的处理:在IIC通信中DC的高低电平是用来选择IIC通信地址的;当DC接地时IIC从机地址为:0x78,当DC接高电平时IIC地址为0x7A;测试程序中所用的为0x78;也就是说大家需要将DC接地关于RES的处理。RES... 查看详情