I2C功能覆盖率

本文详细介绍了I2C协议中寄存器的配置方法,包括硬件复位、位操作、寄存器访问,以及针对不同速度模式的验证。同时,讨论了I2C的从机地址设置,中断状态检查,如活跃状态、模块使能和数据缓存状态。此外,文中还涵盖了中断源识别、中断清除和硬件信号的验证过程。
摘要由CSDN通过智能技术生成

1、寄存器(UVM内建测试寄存器的方法)

1.1、 硬件复位值(uvm_reg_hw_reset_seq)

全部复位结束后,创建seq,rgm寄存器reset,把rgm寄存器赋值给seq的model,start启动。

1.2、 bit_bash(uvm_reg_bit_bash_seq)

1.3、 register_access(uvm_reg_access_seq)

2、i2c协议

2.1、目标和从地址(IC_TAR、IC_SAR寄存器的设置)

target_address_and_slave_address_cg

检查addr[9:7],判断这三位是否wildcard满足{3‘b1xx、3‘b0xx}

检查addr[6:0],判断这七位是否wildcard满足{7‘b1xx_xxxx、7‘b0xx_xxxx}

验证十位的地址,就需要检查传来addr参数的高位,验证7位地址,只需要检查传来的addr的地位

主要验证了DW_APB_I2C的master模式,向IC_CON[6]写1禁用slave模式,向IC_CON[0]写1启用master模式,这个模式下,目标从地址主要是设置IC_TAR的值。利用apb_config_seq配置IC_TAR的地址,并进行正常的读写访问就可以覆盖验证,其中,通过改变代表十位/七位地址访问的寄存器的值从而完成IC_TAR的十位和七位的访问。

对于IC_SAR的地址访问验证,需要验证DW_APB_I2C的slave设计模式,暂未进行。向IC_CON[6]为0取消slave_disable,向IC_CON[0]写0禁用master模式,配置IC_SAR作为从机的地址。

2.2、(???)速度模式(标准速度模式(standardard mode)、快速模式(fast mode)、高速模式(high_speed))

speed_modes_cg

检查表示速度的参数值的值{1,2,3}

验证速度模式设置,采样寄存器的值,看看是否将三个参数都覆盖到。

利用apb_config_seq配置表示SPEED的寄存器的值,并正常进行读写访问,从而可以验证三种速度模式。对于高低保持时间的验证采用同样的方法,其保持的最大/最小时间根据计算求得

检查各个模式下的高保持时间和低保持时间。

以快速模式为例:SCL的频率是<=400Kbs,快速模式频率大于标准模式,所以快速模式下,我们检查的速度范围为100-400Kbs,i2c_clk的时钟频率为100MHz,

最大速度、最小时间保持为100MHz/400Kbs=250=FS_SCL_HCNT+FS_SCL_LCNT,

最小速度、最大保持时间为100MHz/100Kbs=1000=FS_SCL_HCNT+FS_SCL_LCNT

检查HS_SCL_HCNT的最大值为[400:600]

检查HS_SCL_HCNT的最小值为[120:150]

检查HS_SCL_LCNT的最大值为[400:600]

检查HS_SCL_LCNT的最小值为[120:150]

以标准速度模式为例:SCL的频率是0-100Kbs,为了避免0速度,我们只检查50-100Kbs。

最大速度、最小时间保持为100MHz/100Kbs=1000=FS_SCL_HCNT+FS_SCL_LCNT,

最小速度、最大保持时间为100MHz/50Kbs=2000=FS_SCL_HCNT+FS_SCL_LCNT

检查SS_SCL_HCNT的最大值为[800:1000]

检查SS_SCL_HCNT的最小值为[400:600]

检查SS_SCL_LCNT的最大值为[800:1000]

检查SS_SCL_LCNT的最小值为[400:600]

以高速模式为例:SCL的频率是<=3.4Mbs,为简便,我们检查1-3.4Mbs。

最大速度、最小时间保持为100MHz/3.4Mbs≈30=FS_SCL_HCNT+FS_SCL_LCNT,

最小速度、最大保持时间为100MHz/1Mbs=100=FS_SCL_HCNT+FS_SCL_LCNT

检查HS_SCL_HCNT的最大值为[40:60]

检查HS_SCL_HCNT的最小值为[10:20]

检查HS_SCL_LCNT的最大值为[40:60]

检查HS_SCL_LCNT的最小值为[10:20]

对于SCL的高低保持时间,个人认为只要在相应的速度区间内,计算出来高和低相加的和,然后高低时间随意配置(设计里面可能有一个限制值),只要相加是计算出来的数即可。本验证并位验证全部可能紧紧取了部分合理值。

2.3、7比特-10比特地址

bits7_or_bits10_addressing_cg

检查7或者10比特地址位,7bit地址就是{0},10bit地址就是{1}。

利用apb_config_seq配置IC_10BITADDR_MASTER的值,0表示7比特,1表示10比特地址。

2.4、检查restart状态(restart使能或者去除)

restart_condition_cg

检查restart比特,禁止是{0},使能是{1}

利用apb_config_seq配置寄存器IC_RESATRT_EN域的值为0或者1。在i2c协议中,十位地址读或者者组合传输格式中都会用到restart,可以在禁用或者开启restart的时候进行10比特读或者组合格式传输验证restart功能。

3、状态检查

3.1、活跃状态(模块是否是在活跃的状态)

activity_cg

空闲(idle)就是{0},忙碌(busy)就是{1}

master的活跃状态同slave

正常的读写,总线前后可以加上时间延迟,总线都会有idle的状态,有这个状态,就会触发相应寄存器,检查IC_STATUS就可以知道活跃状态是否正常。apb_config_seq配置,然后正常写数据,不断检查IC_STATUS寄存器中的【0】位的ACTIVITY的状态。coverage自动检测收集不必不断检查。

3.2模块使能(检查模块是否是使能的,并检查非使能状态)

检查模块使能的控制比特和使能状态的比特

ENABLE_CTRL比特使能就是{1},禁止就是{0}

ENABLE_STATUS比特使能就是{1},禁止就是{0}

每次对模块操作使其执行一些配置的命令的时候,在配置的最后都需要配置ENABLE==1,初始为0,同时也可以在运行中间直接将其写0禁止。同时IC_ENABLE_STATUS寄存器的IC_EN状态随模块使能/禁用而变化。IC_EN由rkv_i2c_if引出可以在此接口检查。

4、I2C数据缓存

4.1、tx_fifo的状态(空、满、溢出)

tx_fifo_cg

检查tx_fifo的空、满、溢出状态分别用{1},{0}来表示。

TX_FIFO是用来存储apb端发送来的数据的,在seq开始,都是apb_config配置寄存器的值,这时候TX_FIFO就是empty,apb端发送多个数据直到超过TX_FIFO的存储极限,这时候就到了满和溢出的状态。配置IC_RX_TL和IC_TX_TL寄存器,决定触发TX\RX_FIFO有关中断的阈值。

4.2、rx_fifo的状态(空、满、溢出)

rx_fifo_cg

检查rx_fifo的空、满、溢出状态分别用{1},{0}来表示。

RX_FIFO是用来存储I2C端发送来的数据,在seq的开始,配置寄存器值的时候,FIFO就是empty,i2c_slave端发送很多数据超过极限,就到了满和溢出的状态。在I2C端写入多个数据,而apb端并不从寄存器中将数据读出,那么RX_FIFO里面数据就会不断增多最终溢出。

5、中断

5.1、状态寄存器(检查是否中断寄存器能够反应状态)

interrupt_status_cg

检查14个中断状态对应14‘bxx_xxxx_xxxx_xxxx中的位,因为可能检查时候会有多个中断同时触发,所以这里要用wildcard来匹配x。

GEN_CALL:GEN_CALL操作被确认时置1,可通过禁用I2C接口或读取IC_CLR_GEN_CALL寄存器清零。进行吧保留地址00000000访问,从而可以触发此中断,通过mirror寄存器检查到中断后,访问中断清除寄存器,从而清除中断。

START_DET:表示I2C是否发生了START或者RESTARRT。通过配置10bit地址读,就可以同时有START和RESDTART条件产生。

STOP_DET:表示I2C是否发生了STOP条件。任意一个正常结束的数据传输都有发生STOP。

ACTIVITY:表示I2C处于活动状态,包括IDLE。可以通过禁用I2C接口、系统复位、读取IC_CLR_ACTIVITY或者IC_CLR_INTR来清除。

RX_DONE:当I2C作为从机发送数据,主机回应NACK时,该位置1。未验证DW_APB_I2C作为slave的情况,因此此中断无法触发。

TX_ABRT:表示当I2C发送数据时是否无法正常完成操作。置1表示传输终止,此时TX_FIFO清空,可通过IC_TX_ABRT_SOURCE寄存器获得终止原因,并使TX_FIFO重新获取APB接口数据。(这个如何让它发送数据无法正常完成???)

。。。。。。。

5.2、清除寄存器(检查是否访问寄存器能清除对应中断)(11个中断清除寄存器)

interrupt_clear_cg

检查各个清空位是否都是{1}

在内部中断状态寄存器产生中断的时候,就可以同时访问相应的中断清除寄存器,从而清除中断。其中,中断状态寄存器里面的TX_EMPTY和RX_FULL中断没有对应的中断清除寄存器来清除中断,原因是TX_EMPTY在APB端写入数据之前,TX_EMPTY就会被触发,当APB端写进数据的时候,TX_FIFO中有了数据,TX_EMPTY的中断就会自动被清除。RX_FULL中断触发的条件是I2C端发来的数据填满RX_FIFO,触发中断,当里面数据被读出,RX_FIFO不再为FULL的时候,中断自动清除。

5.3、硬件信号(检查是否硬件信号相应的输出会被拉高)

interrupt_hardware_outputs_cg

检查12个内部中断信号的ID位是否拉高了12‘bxxxx_xxxx_xxxx对应的位,使用wildcard来匹配

5.4、中断源(识别出不同tx_abort_source)

tx_abort_source_cg

检查中断源是否对应拉高17‘bx_xxxx_xxxx_xxxx_xxxx的比特位

6、SDA控制(建立保持时间)

sda_control_cg

RX_HOLD,rx数据保持最大值为[100:$],最小值为[1:9],正常值为[10:99]

TX_HOLD,rx数据保持最大值为[100:$],最小值为[1:9],正常值为[10:99]

SDA_SETUP,建立时间最大值为[100:$],最小值为[1:9],正常值为[10:99]

7、退出时间计数()

timeout_counter_cg

最大值[10:$],正常值[4:9],最小值[1:3]

coveragemodel中的new函数里面,将covergroup进行new例化,build_phase连接接口等,run_phase中运行采样的任务:①硬件输出中断的信号监控,以触发此部分covergroup收集覆盖率②等待前后门访问时间的触发,根据寄存器名称和域参数,触发covergroup的sample函数,收集覆盖率。

还有许多没有验证到的地方:

①整个模块作为从机的响应。

②地址值的随机组合,错误地址(如与保留地址冲突,地址错误等)

③多从机,目前只有单个从机

④范围性的参数,如速度和时间的验证不完备

⑤个别中断的触发未成功验证

IC_RAW_INTR_STAT:与IC_INTR_STAT寄存器不同,这些位没有被屏蔽,因此它们总是显示DW_apb_i2c的真实状态。

[31:15]       RSVD_IC_RAW_INTR_STAT         IC_RAW_INTR_STAT保留位-只读

[14]         SCL_STUCK_AT_LOW       

 指示IC_SCL_STUCK_LOW_TIMEOUT ic_clk周期的SCL行是否卡在低位。仅当IC_BUS_CL . 0时启用

[13]        MASTER_ON_HOLD        

指示master是否持有总线,TX FIFO是否为空。仅当I2C_DYNAMIC_TAR_UPDATE=1和IC_EMPTYFIFO_HOLD_MASTER_EN=1时启用

[12]        RESTART_DET        

表示当DW_apb_i2c工作在Slave模式并且Slave正在被寻址时,I2C接口是否发生了RESTART条件。仅当IC_SLV_RESTART_DET_EN=1时启用。注意:然而,在高速模式或在START字节传输期间,根据I2C协议,RESTART出现在地址字段之前。在这种情况下,当发出RESTART时,slave不是寻地址slave,因此DW_apb_i2c不会生成RESTART_DET中断。

[11]        GEN_CALL        

仅当接收到常规呼叫地址并被确认时设置。它一直保持设置,直到通过禁用DW_apb_i2c或当CPU读取IC_CLR_GEN_CALL寄存器的第0位时才被清除。DW_apb_i2c将接收到的数据存储在Rx缓冲区中

[10]        START_DET       

 指示无论DW_apb_i2c工作在slave模式还是master模式,I2C接口上是否发生了START或RESTART条件

[9]        STOP_DET        

无论DW_apb_i2c工作在slave模式还是master模式,都指示I2C接口上是否发生了STOP条件。

[8]        ACTIVITY        

这个位捕获DW_apb_i2c活动并保持设置,直到它被清除。有四种方法来清除它:■禁用DW_apb_i2c■读取IC_CLR_ACTIVITY寄存器■读取IC_CLR_INTR寄存器■系统重置一旦设置了该位,它将保持设置,除非使用四种方法中的一种来清除它。即使DW_apb_i2c模块处于空闲状态,该位也将保持设置,直到清除为止,这表明总线上有活动。

[7]        RX_DONE        

当DW_apb_i2c充当从发送器时,如果主服务器不承认传输的字节,则该位被设置为1。这发生在传输的最后一个字节上,表明传输已经完成。

[6]        TX_ABRT        

此位表示DW_apb_i2c作为I2C发送器,是否无法完成对发送FIFO内容的预期操作。这种情况既可以发生在I2C主机,也可以发生在I2C从机,这种情况被称为“传输中止”。当该位设置为1时,IC_TX_ABRT_SOURCE寄存器表示发生传输中止的原因。注意:当IC_TX_ABRT_SOURCE寄存器跟踪的任何事件导致传输中止时,DW_apb_i2c只会刷新/重置/清空TX_FIFO。Tx FIFO一直处于刷新状态,直到读取寄存器IC_CLR_TX_ABRT。一旦执行了读取操作,Tx FIFO就准备从APB接口接收更多的数据字节。由于TX_ABRT, RX FIFO flush由coreConsultant参数IC_AVOID_RX_FIFO_FLUSH_ON_TX_ABRT控制。

[5]         RD_REQ        

当DW_apb_i2c作为从服务器,另一个I2C主服务器试图从DW_apb_i2c读取数据时,该位被设置为1。DW_apb_i2c将I2C总线保持在等待状态(SCL=0),直到该中断被服务,这意味着从服务器已经被请求传输数据的远程主服务器寻址。处理器必须响应这个中断,然后将请求的数据写入IC_DATA_CMD寄存器。这个位在处理器读取IC_CLR_RD_REQ寄存器后被设置为0。

[4]        TX_EMPTY        

TX_EMPTY中断状态的行为根据IC_CON寄存器中的TX_EMPTY_CTRL选择而有所不同。

当TX_EMPTY_CTRL = 0时:当传输缓冲区等于或低于IC_TX_TL寄存器中设置的阈值时,该位被设置为1。

当TX_EMPTY_CTRL = 1:当传输缓冲区等于或低于IC_TX_TL寄存器中设置的阈值,并且最近弹出命令的地址/数据从内部移位寄存器传输完成时,此位被设置为1。

当缓冲区级别超过阈值时,硬件会自动清除。当IC_ENABLE[0]设置为0时,TX FIFO将被刷新并保持在reset状态。在这里,TX FIFO看起来没有数据,所以这个位被设置为1,前提是主状态机或从状态机中有活动。当不再有任何活动时,当ic_en=0时,该位被设置为0

[3]        TX_OVER        

如果传输缓冲区被填充到IC_TX_BUFFER_DEPTH,并且处理器试图通过写入IC_DATA_CMD寄存器来发出另一个I2C命令,则在传输期间设置。当模块被禁用时,这个位保持它的电平,直到主或从状态机进入空闲状态,当ic_en变为0时,这个中断被清除。

[2]        RX_FULL       

 当接收缓冲区达到或超过IC_RX_TL寄存器中的RX_TL阈值时设置。当缓冲区级别低于阈值时,硬件会自动清除。如果模块被禁用(IC_ENABLE[0]=0), RX FIFO被刷新并保持在reset;因此RX FIFO没有满。因此,一旦IC_ENABLE位0被编程为0,无论活动是否继续,该位都将被清除。

[1]        RX_OVER        

如果接收缓冲区完全填充为IC_RX_BUFFER_DEPTH,并且从外部I2C设备接收额外的字节,则设置。DW_apb_i2c承认这一点,但是在FIFO满后接收到的任何数据字节都将丢失。如果模块被禁用(IC_ENABLE[0]=0),该位将保持其电平,直到主或从状态机进入空闲状态,当ic_en变为0时,此中断将被清除。

注意:如果配置参数IC_RX_FULL_HLD_BUS_EN被启用,并且IC_CON寄存器(RX_FIFO_FULL_HLD_CTRL)的第9位被编程为HIGH,那么RX_OVER中断永远不会发生,因为Rx FIFO永远不会溢出。

[0]        RX_UNDER        

当接收缓冲区为空时,处理器试图通过从IC_DATA_CMD寄存器读取接收缓冲区,则设置。如果模块被禁用(IC_ENABLE[0]=0),该位将保持其电平,直到主或从状态机进入空闲状态,当ic_en变为0时,此中断将被清除。

IC_INTR_STAT:

I2C中断状态寄存器这个寄存器中的每个位在IC_INTR_MASK寄存器中都有一个对应的掩码位。通过读取匹配的中断清除寄存器来清除这些位。这些位的未屏蔽原始版本在IC_RAW_INTR_STAT寄存器中可用。

[31:15]        IC_INTR_STAT保留位-只读        

[14]        R_SCL_STUCK_AT_LOW        有关R_SCL_STUCK_AT_LOW位的详细描述,请参阅IC_RAW_INTR_STAT

[13]        R_MASTER_ON_HOLD        

[12]        R_RESTART_DET

[11]        R_GEN_CALL

[10]        R_START_DET

[9]        R_STOP_DET

[8]        R_ACTIVITY

[7]        R_RX_DONE

[6]        R_TX_ABRT

[5]        R_RD_REQ

[4]        R_TX_EMPTY

[3]        R_TX_OVER

[2]        R_RX_FULL

[1]        R_RX_OVER

[0]        R_RX_UNDER

IC_TX_ABRT_SOURCE:这个寄存器有32位,表示TX_ABRT位的源。除第9位外,每当读取IC_CLR_TX_ABRT寄存器或IC_CLR_INTR寄存器时,该寄存器都会被清除。要清除比特9,必须首先修复ABRT_SBYTE_NORSTRT的源;必须启用RESTART (IC_CON[5]=1),必须清除SPECIAL位(IC_TAR[11]),或必须清除GC_OR_START位(IC_TAR[10])。

一旦ABRT_SBYTE_NORSTRT的源是固定的,那么这个位就可以像这个寄存器中的其他位一样被清除。如果在尝试清除此位之前ABRT_SBYTE_NORSTRT的源不固定,则清除位9一个周期,然后重新断言。

[31:23]        TX_FLUSH_CNT        

该字段表示由于 TX_ABRT中断而被刷新的Tx FIFO Data命令的个数。当I2C被禁用时,该告警将被清除

[22:21]        RSVD_IC_TX_ABRT_SOURCE

IC_TX_ABRT_SOURCE保留位-只读

[20]        ABRT_DEVICE_WRITE

这是一个主模式位。Master启动DEVICE_ID传输,Tx-FIFO由写命令组成。

DW_apb_i2c的作用:主值:■0x1 (ACTIVE):由于从地址的NOACK而生成中止。■0x0 (INACTIVE):不生成中止

[19]        ABRT_DEVICE_SLVADDR_NOACK

这是一个主模式位。主从端正在发起DEVICE_ID传输,从端发送的地址没有被任何从端确认。DW_apb_i2c的作用:主值:■0x1 (ACTIVE):由于从地址的NOACK而生成中止。■0x0 (INACTIVE):不生成中止

[18]        ABRT_DEVICE_NOACK

这是一个主模式位。主服务器正在初始化DEVICE_ID传输,并且发送的设备id没有被任何从服务器确认。DW_apb_i2c的作用:Master值:■0x1 (ACTIVE):由于DEVICE-ID的NOACK而生成该中止。■0x0 (INACTIVE):不生成该中止

[17]        ABRT_SDA_STUCK_AT_LOW

这是一个主模式位。Master检测到ic_clks的IC_SDA_STUCK_AT_LOW_TIMEOUT值的SDA卡在low。        DW_apb_i2c的作用:Master值:■0x1 (ACTIVE):由于ic_clks的IC_SDA_STUCK_AT_LOW_TIMEOUT值的Sda卡在低位而生成此中止。■0x0 (INACTIVE):不生成此中止

[16]        ABRT_USER_ABRT

这是一个主模式位。主机检测到传输中断(IC_ENABLE[1])        DW_apb_i2c的作用:master- transmitter值:■0x1 (ABRT_USER_ABRT_GENERATED): master检测到传输中止■0x0 (ABRT_USER_ABRT_VOID): master检测到传输中止场景不存在

[15]        ABRT_SLVRD_INTX

1:当处理器端响应一个从模式请求,将数据传输到远程主服务器,用户在IC_DATA_CMD寄存器的CMD(位8)中写入一个1

DW_apb_i2c的作用:从端发射器值:■0x1 (ABRT_SLVRD_INTX_GENERATED):从端试图以读模式传输到远端主端■0x0 (ABRT_SLVRD_INTX_VOID):从端试图以读模式传输到远端主端-场景不存在

[14]        ABRT_SLV_ARBLOST

该字段表示Slave在向远程主机传输数据时丢失了总线。

同时配置IC_TX_ABRT_SOURCE[12]。

注意:即使slave从未“拥有”总线,总线上也可能出现问题。这是一个故障安全检查。例如,在SCL从低到高转换的数据传输过程中,如果数据总线上的内容不是应该传输的内容,那么DW_apb_i2c就不再拥有总线。

DW_apb_i2c的作用:从机-发射器值:■0x1 (ABRT_SLV_ARBLOST_GENERATED):从机失去对远程主机的仲裁■0x0 (ABRT_SLV_ARBLOST_VOID):从机失去对远程主机的仲裁-场景不存在

[13]        ABRT_SLVFLUSH_TXFIFO       

该字段指定从机已经接收到一个读命令,并且TX FIFO中存在一些数据,因此从机发出TX_ABRT中断来刷新TX FIFO中的旧数据。

DW_apb_i2c的作用:从机-发射器值:■0x1 (ABRT_SLVFLUSH_TXFIFO_GENERATED):从机在获得read命令时刷新TX-FIFO中的现有数据■0x0 (ABRT_SLVFLUSH_TXFIFO_VOID):从机在获得read命令时刷新TX-FIFO中的现有数据-不存在场景

[12]        ARB_LOST        

该字段指定主服务器已失去仲裁,或者如果还设置了IC_TX_ABRT_SOURCE[14],则从服务器已失去仲裁。

DW_apb_i2c的作用:主发射器或从发射器值:■0x1 (ABRT_LOST_GENERATED):主发射器或从发射器失去仲裁■0x0 (ABRT_LOST_VOID):主发射器或从发射器失去仲裁-场景不存在

[11]        ABRT_MASTER_DIS

该字段表示用户试图在禁用主模式的情况下发起主操作。

DW_apb_i2c的作用:master - transmitter或master - receiver值:■0x1 (ABRT_MASTER_DIS_GENERATED):禁用master时用户发起主操作■0x0 (ABRT_MASTER_DIS_VOID):禁用master时用户发起主操作-不存在场景

[10]        ABRT_10B_RD_NORSTRT

该字段表示禁用重启(IC_RESTART_EN bit (IC_CON[5]) =0), master以10位寻址方式发送read命令。

DW_apb_i2c的作用:主接收器值:■0x1 (ABRT_10B_RD_GENERATED):当RESTART禁用时,主服务器试图以10Bit寻址模式读取■0x0 (ABRT_10B_RD_VOID):当RESTART禁用时,主服务器不试图以10Bit寻址模式读取

[9]        ABRT_SBYTE_NORSTRT

要清除比特9,必须首先修复ABRT_SBYTE_NORSTRT的源;必须启用restart (IC_CON[5]=1),必须清除SPECIAL位(IC_TAR[11]),或必须清除GC_OR_START位(IC_TAR[10])。一旦ABRT_SBYTE_NORSTRT的源是固定的,那么这个位就可以像这个寄存器中的其他位一样被清除。如果在尝试清除这个位之前ABRT_SBYTE_NORSTRT的源不固定,那么位9将被清除一个周期,然后被重新声明。当该字段被设置为1时,重启被禁用(IC_RESTART_EN bit (IC_CON[5]) =0),用户正在尝试发送一个START字节。

DW_apb_i2c的角色:Master

[8]        ABRT_HS_NORSTRT

该字段表示重启被禁用(IC_RESTART_EN bit (IC_CON[5]) =0),用户正在尝试使用master以高速模式传输数据。

DW_apb_i2c的作用:Master- transmitter或Master- receiver值:■0x1 (ABRT_HS_NORSTRT_GENERATED):当RESTART被禁用时,用户试图切换Master到HS模式■0x0 (ABRT_HS_NORSTRT_VOID):当RESTART被禁用时,用户试图切换Master到HS模式-不存在场景

[7]        ABRT_SBYTE_ACKDET

该字段表示主机已经发送了一个START字节,并且该START字节已被确认(错误行为)。

DW_apb_i2c的作用:主值:■0x1 (ABRT_SBYTE_ACKDET_GENERATED):检测到START字节的ACK■0x0 (ABRT_SBYTE_ACKDET_VOID):检测到START字节的ACK -不存在场景

[6]        ABRT_HS_ACKDET

此字段表示主服务器处于高速模式,并且已确认高速主服务器代码(错误行为)。

DW_apb_i2c的作用:主值:■0x1 (ABRT_HS_ACK_GENERATED): HS主码acks在HS模式■0x0 (ABRT_HS_ACK_VOID): HS主码acks在HS模式-场景不存在

[5]        ABRT_GCALL_READ

该字段表示主模式下的DW_apb_i2c已经发送了一个General Call,但是用户编程了General Call后面的字节从总线读取(IC_DATA_CMD[9]被设置为1)。

DW_apb_i2c的作用:Master-Transmitter值:■0x1 (ABRT_GCALL_READ_GENERATED): GCALL之后从总线读取■0x0 (ABRT_GCALL_READ_VOID): GCALL之后从总线读取-场景不存在

[4]        ABRT_GCALL_NOACK

该字段表示主模式下的DW_apb_i2c已经发送了一个General Call,并且总线上没有slave确认该General Call。

DW_apb_i2c的作用:Master-Transmitter值:■0x1 (ABRT_GCALL_NOACK_GENERATED): GCALL not ackby any slave■0x0 (ABRT_GCALL_NOACK_VOID): GCALL not ackby any slave-scenario不存在

[3]        ABRT_TXDATA_NOACK

该字段表示仅主模式位。当主服务器接收到地址的确认,但当它在地址后面发送数据字节时,它没有从远程从服务器接收到确认。

DW_apb_i2c的作用:主-发射器值:■0x1 (ABRT_TXDATA_NOACK_GENERATED):传输的数据未被已寻址的从机封装■0x0 (ABRT_TXDATA_NOACK_VOID):传输的数据未被已寻址的从机封装—场景不存在

apb_write_packet_seq将写的数据进行写入,然后i2c_slv_write_rsp中将nack_data的个数置为1,那么主机发送地址的时候会正常回应,但是主机在发送数据的时候回应是nack。

[2]        ABRT_10ADDR2_NOACK

该字段表示主服务器处于10位地址模式,并且该10位地址的第二个地址字节没有被任何从服务器承认。

DW_apb_i2c的作用:Master-Transmitter或master - receiver值:■0x1 (ACTIVE): 10Bit地址的第2字节不被任何slave占用■0x0 (INACTIVE):不生成abort

将地址低五位写为错误的地址,高两位写为正确的地址?发送第一个地址比特位时候,高两位可以对得上,正常回应ack,发送第二个比特时候,低五位地址不对,回应nack。

[1]        ABRT_10ADDR1_NOACK

该字段表示主服务器处于10位地址模式,且前10位地址字节没有被任何从服务器承认。

重置值:0x0 DW_apb_i2c的角色:主发送端或主接收端值:■0x1 (ACTIVE): 10Bit地址的第1字节不被任何从服务器占用■0x0 (INACTIVE):不生成此abort

同下述7bit地址操作。(可以将地址(高两位的地址)设置为错误的地址?)

[0]        ABRT_7B_ADDR_NOACK

该字段表示主从服务器处于7位寻址模式,发送的地址没有被任何从服务器确认。

DW_apb_i2c的作用:Master-Transmitter或master - receiver值:■0x1 (ACTIVE):由于7位地址的NOACK而生成中止。■0x0 (INACTIVE):不生成中止

apb_user_config中配置10bitaddr_master为0从而使用七位寻址(同时配置其他速度、地址、使能等参数),然后apb_user_write_packet发送对应的写事务,接着i2c_slv_write_resp中将nack_addr的数量设置为1,则在主机发送地址后,从机会立马回复nack(i2c的ip中通过控制ack和nack的数量来控制ack与nack的回复)。apb_intr_wait等待中断的触发,触发中断后,查看输出intr的接口的对应中断是否拉高,apb_intr_clear读取对应的中断清除寄存器,清除中断,然后apb_user_wait_empty等待事务全部完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值