nios通过I2C接口操作si570

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值