I2C虚拟项目-test3

持续更新测试用例解读。


前言

一个个对波形和代码看测试用例其实很费时间,但是我觉得有助于理解协议。坚持呀!


1. rkv_i2c_master_sda_control_cg_test

在这里插入图片描述
当DW_APB_I2C模块作为transmitter/receiver时进行保持时间设置(三种);根据波形可以看出,前三段对应读操作部分,后三段对应写操作部分,对保持时间的设置可以在master/slave模式下进行,但是对建立时间的设置只能在slave transmitter模式下进行。
在这里插入图片描述
保持时间

  1. 访问0x00寄存器(IC_CON控制寄存器),写入’h6d(110 1101),即配置IC_CON[0]为1,以启用DW_apb_i2c为master模式;配置IC_CON[2:1]为10,以设置速度模式为快速模式;配置IC_CON[3]为1,以设置作为slave地址位宽为10bit;配置IC_CON[4]为0,以设置作为master地址位宽为7bit;配置IC_CON[5]为1,打开restart;配置IC_CON[6]为1,以禁用slave模式;高位均置为0,IC_CON[7]为0表示无论是否被寻址到,都产生STOP DET中断;IC_CON[8]为0表示默认TX EMPTY中断行为;IC_CON[9]为0表示当RX_FIFO满时溢出;IC_CON[10]为0表示无论是不是master模式都产生STOP DET;
  2. 访问0x04寄存器(IC_TAR目标地址寄存器),写入’h333(11 0011 0011);
  3. 访问0x1c寄存器(IC_FS_SCL_HCNT快速高计数寄存器),写入’hc8(对应十进制200);
  4. 访问0x20寄存器(IC_FS_SCL_LCNT快速低计数寄存器),写入’hc8(对应十进制200);在这里插入图片描述完成配置;接下来以保持时间为8’d1,作为receiver进行保持时间设置为例
  5. 访问0x7c寄存器(IC_SDA_HOLD 状态寄存器),写入’h10001(1 0000 0000 0000 0001),高16位对应IC_SDA_RX_HOLD设置,表示保持时间设置为1;
  6. 访问0x6c寄存器(IC_ENABLE寄存器),写入’h1;
  7. 访问0x10寄存器(IC_DATA_CMD寄存器),写入’h100(1 0000 0000),表示进行读操作;
  8. 访问0x70寄存器(IC_STATUS状态寄存器),读取到’h2(10),TX_FIFO非空;I2C总线上出现START信号前,0x70寄存器读取均为’h2,START信号期间,0x70寄存器读取值为’h23(100011),表明master FSM处于activity状态,RX_FIFO为空,TX_FIFO非空非满;当开始地址字节传输时,0x70寄存器读取值变为’h27(100111),表明master FSM处于activity状态,RX_FIFO为空,TX_FIFO为空;地址字节为(0110 011 1+ACK),数据字节为(0101 0101+NACK),对于master recceiver,接收最后一个字节后由master发送NACK信号。随后发送RX_FULL中断,再读取0x70寄存器值变为’h2f(101111),TX_FIFO为空,RX_FIFO不为空;
  9. 访问0x10寄存器(IC_DATA_CMD寄存器),读取到’h55(0101 0101),随后I2C总线上产生STOP信号。
  10. 访问0x6c寄存器,写入’h0;
    接下来重复5-10步,将保持时间设置为8’d50和8’d150,进行相同的数据传输。 在这里插入图片描述作为transmitter时进行保持时间的设置以8’d50为例(因为在进行recevier保持时间设置时,进行了高位变化,低16位一直为1,所以当保持时间设置为8’d150时,为960001,这也是transmitter保持时间设置为8’d1时的值,因此在第一阶段没有进行再次设置,步骤不典型)
  11. 访问0x7c寄存器(IC_SDA_HOLD寄存器),写入’h960032,即IC_SDA_TX_HOLD设置为’h32(8’d50);
  12. 访问 0x6c寄存器(IC_ENABLE寄存器),写入’h1;
  13. 访问0x70寄存器,读取到’h6(110);
  14. 访问0x10寄存器(IC_CMD_DATA寄存器),写入’h55;
  15. I2C总线上产生START条件,地址字节0110 011 0+ACK,数据字节0101 0101+ACK,STOP信号;对于master transmitter,最后一个字节的ACK/NACK信号由slave发送。
  16. 访问0x6c寄存器,写入’h0;在这里插入图片描述保持时间为8’d1和8’d150的传输步骤与11-16相同。
    注释:IC_SDA_HOLD寄存器中的值以 ic_clk 周期为单位,IC_SDA_TX_HOLD 中编程的值必须大于每个模式下的最小保持时间,主模式下一个周期,从模式下七个周期,才能实现该值。

建立时间
在建立时间分别设置为8’d1, 8’d50, 8’d150;由于 I2C SDA Setup寄存器只会在当DW_APB_I2C作为salve transmitter时被使用,所以没有在I2C总线上体现相关设置。在这里插入图片描述

  1. 访问0x94寄存器(IC_SDA_SETUP寄存器),写入’h1(8’d1),即将建立时间设置为8’d1;

  2. 访问 0x6c寄存器(IC_ENABLE寄存器),写入’h1;

  3. 访问0x6c寄存器,写入’h0;
    至此完成一次建立时间的设置,建立时间为8’d50和8’d150的设置步骤与1-3相同。对应下面代码
    在这里插入图片描述

  4. 最后访问0x70寄存器(IC_STATUS状态寄存器),I2C处于禁用状态,对应apb_wait_empty_seq的操作。

2. rkv_i2c_master_timeout_cg_test

在这里插入图片描述
对timeout的设置在波形上体现为pready拉低时间的变化(pslverr拉高时间始终为4000ps),最终编程值确定寄存器超时计数器从哪个值开始倒计时。 此计数器上的零将通过pslverr为高中断等待的事务。

  1. 访问0x00寄存器(IC_CON控制寄存器),写入’h6d(110 1101),即配置IC_CON[0]为1,以启用DW_apb_i2c为master模式;配置IC_CON[2:1]为10,以设置速度模式为快速模式;配置IC_CON[3]为1,以设置作为slave地址位宽为10bit;配置IC_CON[4]为0,以设置作为master地址位宽为7bit;配置IC_CON[5]为1,打开restart;配置IC_CON[6]为1,以禁用slave模式;高位均置为0,IC_CON[7]为0表示无论是否被寻址到,都产生STOP DET中断;IC_CON[8]为0表示默认TX EMPTY中断行为;IC_CON[9]为0表示当RX_FIFO满时溢出;IC_CON[10]为0表示无论是不是master模式都产生STOP DET;

  2. 访问0x04寄存器(IC_TAR目标地址寄存器),写入’h333(11 0011 0011);7bit模式下对应地址为011 0011;

  3. 访问0x1c寄存器(IC_FS_SCL_HCNT快速高计数寄存器),写入’hc8(对应十进制200);

  4. 访问0x20寄存器(IC_FS_SCL_LCNT快速低计数寄存器),写入’hc8(对应十进制200);
    完成基本配置在这里插入图片描述

  5. 访问0xf0寄存器(REG_TIMEOUT_RST寄存器),写入’h1,对应timeout[0] (4’b0001);

  6. 访问0x6c寄存器(IC_ENABLE寄存器),写入’h1;

  7. 访问0x10寄存器(IC_DATA_CMD寄存器),写入’h0;接着依次写入’h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7,在将要写入’h8时,pready信号拉低(318000ps-322000ps),共计4000ps,占整个penable有效时间的1/2,其中penable信号拉高时间为318000ps-326000ps,共计8000ps,待pready信号拉高后,pslverr信号接着拉低(4000ps),表示传输异常,'h8写入失败(因为在IC_COMP_PARAM_1 寄存器中设置的TX BUFFER DEPTH为7,即深度为8,所以不能存入第9个数据,引起pready拉低);

  8. 随后观测到I2C总线出现(地址字节)0110 011 0(write)+ACK,(数据字节)0000 0000+ACK,0000 0001+ACK,0000 0010+ACK,0000 0011+ACK,0000 0100+ACK,0000 0101+ACK,0000 0110+ACK,0000 0111+ACK,STOP信号,开始最后一个字节的发送后,出现TX_EMPTY中断,出现STOP信号后中断消失;

  9. 访问0x6c寄存器(IC_ENABLE寄存器),写入’h0;
    至此完成timeout[0]的测试;timeout[1]为4’b0111,pready拉低时间343354000ps-343382000ps,共计28000ps, pslverr拉高时间为4000ps,占整个penable有效时间的7/8,其中penable拉高时间343354000ps-343386000ps,共计32000ps;
    timeout[2]为4’b1100,pready拉低时间686434000ps-686482000ps,共计48000ps,占整个penable有效时间的12/13,pslverr拉高时间为4000ps,其中penable 拉高时间为686434000ps-686486000ps,共计52000ps。
    对应代码为在这里插入图片描述

波形图如下:在这里插入图片描述

总结

虽然秋招艰难,但也还是要继续学呀!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ann_xia66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值