您好的团队:
客户设计:当程序读取 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));
此致