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
I2CDelay();
return b;
}
源代码是这样的,IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_2_BASE, 0x00); 为转换IO口方向函数,PIO_2_BASE为S