si570提供了i2c接口的操作方式。fpga程序分配两个IO作为scl及sda来操作i2c接口,其中scl为输出接口,sda为双向口。
在nios程序中,一开始按照时序要求来编写代码,但是实验结果总是不尽如人意,ACK总是不能按照预想的出现,一开始怀疑方向是时序间延时不够,故加大延时时间,但结果并没有明显改变。用示波器观察时序,发现问题出在给第9个时钟来接收ACK的时候,SDA确实会被拉低,但有时拉低的幅度极小,将怀疑方向改为是否有人拉高了SDA使其没能降下来以至于没有形成ACK。在朋友的帮助下,最后将怀疑对象锁定在nios的双向口方向转换上面。
uint8_t
I2CGetBit(void)
{
uint8_t b;
I2C_SDA_HI; // Data high = input (opencollector)
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_2_BASE, 0x00);
I2CDelay();
I2C_SCL_HI;
I2CStretch(); // SDA Hi Z and wait
b = (SDA); // get bit
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_2_BASE, 0x01);
I2CDelay();
I2C_SCL_LO; // clock low

本文档详细介绍了在FPGA中的Nios系统通过I2C接口操作SI570时遇到的ACK接收问题。在初始代码中,由于可能在未读取数据前就将SDA口方向重新设置为输出,导致ACK信号无法正确识别。通过对I2CGetBit函数的修改,将SDA方向转换延后,解决了这个问题,使得SI570能够正常响应并接收ACK。

407

被折叠的 条评论
为什么被折叠?



