在读取IIC从设备数据时,首先要发送从设备地址,我要控制的IIC外设还需要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); --> 该部分代码块定义了3个字节的控制字,设置从设备地址,IIC模式为MasterSend,RM模式,初始化配置不知用FIFO
I2C_sendStartCondition(I2CA_BASE);
while( I2C_getStatus(I2CA_BASE) & I2C_STS_NO_ACK );
DEVICE_DELAY_US(100); --> 该部分代码块设置STT位,并循环检测NACK位状态用以等待设备地址发送完成,设备地址发送完成后,引用100uS延时
/* 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); --> 该部分代码块发送控制字,并循环检测NACK位状态用以等待设备地址发送完成,发送完成后,引用100uS延时
/* 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); --> 该部分代码块发送控制字,并循环检测NACK位状态用以等待设备地址发送完成,发送完成后,引用100uS延时
/* 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); --> 该部分代码块发送控制字,并循环检测NACK位状态用以等待设备地址发送完成,发送完成后,引用100uS延时
至此,完成了读取从设备的第一部分操作,发送了设备地址及3个自己的控制位。
接下来,需要将IIC设置为MasterRecieve模式用以接收从设备数据。需要接收4个字节的从设备数据,但是没有想好如何在接收的字节间加入100uS延时。以MasterSend为例,在该模式下,将要发送的数据写入DXR,SCL会产生相应数量的时钟完成每8个bit的发送和1bit 从设备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); -->设置为MasterRecieve模式,CNT为4,自动产生停止位
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;
*result = r;
DEVICE_DELAY_US(100);
while(I2C_getStopConditionStatus(I2CA_BASE));