当我实现I2C从设备时,这里显示了一个问题。我的sda
是一个输入端口。在时间164ns
,即图片中以红色圈出的区域,从属设备将ack=1
写入sda
。之后,测试平台将数据写入sda
,从属SRAM从sda
读取。
然而,看起来红色圈出的区域也被SRAM读取,这使得SRAM在MSB中以蓝色表示区域显示1。实际上,SRAM应该在红色圆圈区域之后从该区域读取。可能导致此错误的原因是什么?
部分代码如下所示
READ_DATA:begin
addr_x<=addr_x;
ROM<=DATA_IN_ROM;
SRAM[SRAM_LEN-cnt]<=sda;
end
READ_ADDR: begin // rw<=rw;
SRAM<=SRAM;
ROM<=DATA_IN_ROM;
addr_x[REG_LEN-cnt-1]<=sda;
cnt<=cnt+1;
sda_reg<=sda_reg;
sda_vid<=sda_vid;
freeze_cnt<= freeze_cnt;
freeze<=freeze;
rwcnt<=rwcnt;
end
答案 0 :(得分:0)
根据您的duplicate post我认为您过早进入READ_DATA
州。添加在ACK_R
和RW
之间的另一个州(READ_DATA
)。
ACK_R: begin
sda_reg <= 0;
sda_vin <= 1;
bus_state_next = READ_DATA;
end
这将创建一个时钟周期,在此时无需SRAM读取数据即可执行ACK。如果您已在其他位置设置了ACK信号,则应将其删除。您的计数器现在不应该计为9,而是计为8。这也应该针对ACK_W
。