This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F2.8069万M:I2C驱动器,无中断

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619623/compiler-tms320f28069m-i2c-driver-without-interrupt

部件号:TMS320F2.8069万M

工具/软件:TI C/C++编译器

大家好,我正在为I2C接口编写代码。

下面是我的I2C读写代码

void I2C_setup (I2C_HANDLE i2cHandle)

i2cHandle->I2CSAR = 0x0050;// EEPROM控制代码的从属地址
i2cHandle->I2CPsc.all =7;// Prescaler -需要7~12 MHz的模块时钟
i2cHandle->I2CCLKL =20;//注意:必须为非零
i2cHandle->I2CCLKH =10;//注意:必须为非零

i2cHandle->I2CFFTX.ALL = 0x6040;//启用FIFO模式和TXFIFO
i2cHandle->I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT

i2cHandle->I2CMDR.ALL = 0x0020;//从重置中取出I2C
}

void I2C_Write (uint16_t sAddr,uint16_t addr,uint16_t数据)

HAL_Obj* OBJ =(HAL_Obj*)halHandle;
uINT16_t msbAddr;
uINT16_t地址;
char slaver_addr;

slaver_addr =(sAddr >> 1)和0x7F;
msbAddr =(0x0300和addr)>> 8;
地址=地址和0x00FF;
slaver_addr = slaver_addr | msbAddr;

obj->i2cHandle->I2CSAR = slaver_addr;
obj->i2cHandle->I2CCNT =2;
obj->i2cHandle->I2CDXR =地址和0x00FF;
obj->i2cHandle->I2CDXR =数据和0x00FF;
obj->i2cHandle->I2CMDR.All = 0x2E20;
while (!obj->i2cHandle->I2CSTR.bit.scd)

obj->i2cHandle->I2CSTR.bit.scd = 1;
}


uINT16_t I2C_READ (uint16_t sAddr,uint16_t addr)

HAL_Obj* OBJ =(HAL_Obj*)halHandle;
UINT16_t RDATA;
uINT16_t msbAddr;
uINT16_t地址;
char slaver_addr;

slaver_addr =(sAddr >> 1)和0x7F;
msbAddr =(0x0300和addr)>> 8;
地址=地址和0x00FF;
slaver_addr = slaver_addr | msbAddr;

whil(obj->i2cHandle->I2CSTR.bit.bB)

whit(obj->i2cHandle->I2CMDR.bit.stp)

obj->i2cHandle->I2CSAR = slaver_addr;
obj->i2cHandle->I2CCNT =1;
obj->i2cHandle->I2CDXR =地址和0x00FF;
obj->i2cHandle->I2CMDR.All = 0x2620;
while (!obj->i2cHandle->I2CSTR.bit.ARDY)

obj->i2cHandle->I2CCNT =1;
obj->i2cHandle->I2CMDR.All = 0x2C20;
while (!obj->i2cHandle->I2CSTR.bit.scd)

RDATA = obj->i2cHandle->I2CDRR;

返回(RDATA和0x00FF);
}

下面是访问EEPROM的代码。

I2C_Write (I2C_EEPROM_ADDR,0,0x34);
usDelay(5万);
数据= I2C_READ (I2C_EEPROM_ADDR,0);
UARTprintf ("数据=%d\n",数据);

此代码工作正常。 但是,代码不会延迟地卡在读取中,等待SCD为1。

此时I2CSTR为0x1406。  

我需要你的帮助。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    您可以尝试以下操作: e2e.ti.com/.../I2C_5F00_Writing_5F00_Reading_5F00_EEPROM.c

    此致,

    Gautam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Gautam

    感谢您的更新。

    我认为您不使用FIFO。

    请为您的写入/读取功能提供I2C设置。

    下面是我对设置的假设。

       i2cHandle->I2CSAR = 0x0050;            // EEPROM控制代码的从属地址

      i2cHandle->I2CPsc.all =7;             // Prescaler -需要7~12 MHz的模块时钟
       i2cHandle->I2CCLKL =20;//               注意:必须为非零
       i2cHandle->I2CCLKH =10;//                注意:必须为非零

      i2cHandle->I2CIER.all = 0x00;

     i2cHandle->I2CMDR.ALL = 0x0020;        //从重置中取出I2C

    对吗?

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Gautam

    我有一个问题。

    我正在使用Atmel的Atmel-8880 EEPROM。

    此EEPROM需要一些时间才能完成写入操作。

    如果之前I2C写入的内部写入操作未完成,EEPROM将不会在收到从属地址后发送ACK。

    请告诉我如何检查是否从EEPROM接收ACK。

    以下是EEPROM的流程图。

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    当尚未准备好执行该读取时,您是否在I2CSTR GET SET中看到了nack位? 您是否可以将其用作需要再次尝试发送地址的指示器?

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Whitney:
    感谢你的帮助。
    我检查了每个操作的I2CMDR和I2CFR,并且我了解寄存器的操作。
    发布的流程图由主中继器确认轮询。 只需检查从机的ack,以进行下一个操作。
    如您所知,如果不根据您的数据库发送任何信号,则不能发出C2000停止信号。
    我找到了问题的原因。
    感谢TI的所有帮助。
    Baeyoung