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.

[参考译文] TMS320F28388D:如何在读取从器件数据时在字节之间添加100us 延迟

Guru**** 2603695 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1110088/tms320f28388d-how-to-add-100us-delay-between-bytes-when-reading-slave-device-data

器件型号:TMS320F28388D

您好的团队:

客户设计:当程序读取 I2C 从器件数据时、必须首先发送从器件地址。 此外、受控 I2C 外设还需要一个3字节控制字、代码如下:

// Temp variables
uint8_t val;
unsigned long r = 0;
// Construct the 24 bit control word
char control_word[3] = {0x90, 0x00, addr&0xFF};

I2C_setSlaveAddress(I2CA_BASE, SLAVE_ADDRESS);
//I2C_setDataCount(I2CA_BASE, 0);
I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE|I2C_REPEAT_MODE);

I2C_sendStartCondition(I2CA_BASE);
while( I2C_getStatus(I2CA_BASE) & I2C_STS_NO_ACK );

DEVICE_DELAY_US(100);

/* Send bits CW23-CW16 of the control word */
I2C_putData(I2CA_BASE, control_word[0]);
while( I2C_getStatus(I2CA_BASE) & I2C_STS_NO_ACK );

DEVICE_DELAY_US(100);

/* Send bits CW15-CW8 of the control word */
I2C_putData(I2CA_BASE, control_word[1]);
while( I2C_getStatus(I2CA_BASE) & I2C_STS_NO_ACK );

DEVICE_DELAY_US(100);

/* Send bits CW7-CW0 of the control word */
I2C_putData(I2CA_BASE, control_word[2]);
while( I2C_getStatus(I2CA_BASE) & I2C_STS_NO_ACK );

DEVICE_DELAY_US(100);

此时、读取从器件操作的第一部分完成:发送器件地址和3个控制位。

接下来、客户需要将 IIC 设置为 MasterRecieve 模式以接收从属数据。 需要接收4个字节的从机数据、但客户尚未知道如何在接收到的字节之间添加100us 的延迟。
以 MasterSend 为例、在此模式下、当要发送的数据写入 DXR 时、SCL 将生成相应数量的时钟来完成每8位传输和1位从器件 ACK 检测、从而产生总共9个 SCL 时钟。

但是、如果是 MasterRecieve 模式、如何处理它?  客户当前编写的代码如下:

I2C_setSlaveAddress (I2CA_BASE、SLAVE_ADDRESS);
I2C_setDataCount (I2CA_BASE、4);
I2C_setConfig (I2CA_BASE、I2C_MASTER_Receive_MODE);
I2C_sendStopCondition (I2CA_BASE);  

I2C_sendStartCondition (I2CA_BASE);
while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_REG_ACCESS_RDY));

DEVICE_DELAY_US (100); -->设置 STT 位,并通过检测 ARDY 检测确定器件地址是否已发送。 是否可以使用 ARDY 检测? 那么、该器件中引入的100us 延迟是否有效? 器件地址和第一个接收到的字节之间是否存在延迟?

while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));
Val = I2C_getData (I2CA_BASE);
r |= val;
DEVICE_DELAY_US(100); -->检测数据是否通过 RXDY 接收,并在处理后引入100us 延迟,后续字节之间的处理类似。 此过程是否会导致接收到的字节之间出现100us 的延迟?

while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));
Val = I2C_getData (I2CA_BASE);
r |=((unsigned long) val)<<8;
DEVICE_DELAY_US (100);

while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));
Val = I2C_getData (I2CA_BASE);
r |=((unsigned long) val)<<16;
DEVICE_DELAY_US (100);

while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));
Val = I2C_getData (I2CA_BASE);
r |=(unsigned long) val)<<24;
*结果= r;
DEVICE_DELAY_US (100);

while (I2C_getStopConditionStatus (I2CA_BASE));

此致

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

    绿色、

    每次 RRDY 位置位后需要引入100us 延迟、并在等待100us 后仅读取 I2C RX 数据、这允许主器件执行100us 的时钟扩展。 如果在 RRDY 位置位后立即读取 I2C RX 数据、则主器件无法控制 SCL / SDA 线的时间、因为 I2CDDR 寄存器已准备好接收下一个数据。

    I2C_setSlaveAddress (I2CA_BASE、SLAVE_ADDRESS);
    I2C_setDataCount (I2CA_BASE、4);
    I2C_setConfig (I2CA_BASE、I2C_MASTER_Receive_MODE);
    I2C_sendStopCondition (I2CA_BASE);  

    I2C_sendStartCondition (I2CA_BASE);

    DEVICE_DELAY_US (100);
    while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_REG_ACCESS_RDY));

    while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));

    DEVICE_DELAY_US (100);

    Val = I2C_getData (I2CA_BASE);
    r |=((unsigned long) val)<<8;

    while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));

    DEVICE_DELAY_US (100);

    Val = I2C_getData (I2CA_BASE);
    r |=((unsigned long) val)<<16;

    while (!(I2C_getStatus (I2CA_BASE)& I2C_STS_RX_DATA_RDY));

    DEVICE_DELAY_US (100);


    Val = I2C_getData (I2CA_BASE);
    r |=(unsigned long) val)<<24;
    *结果= r;

    while (I2C_getStopConditionStatus (I2CA_BASE));

    此致、

    曼诺伊