您好,
我正在尝试为MMA8452 (加速计)实施I2C驱动程序,如下所示
我编写了以下驱动程序。 但是,我从UC得到了一些非常奇怪的输出。 当我尝试从总线检索单字节数据时,它总是尝试获取两个字节。 在UC发出第二个字节的时钟后,I2C总线被锁定。 摆脱锁定的唯一方法是重启主板。 为什么UC尝试获取第二个字节? 我甚至特别使用 了EUSCI_B_I2C_masterReceiveSingleByte,但UC仍尝试获取第二个字节。
uINT8_t I2c_read_byte(uint8_t slaver_address, uint8_t reg_address, uint8_t len, uint8_t *data){
uINT8_t i;
uINT16_t retry=0x1000;
//启用I2C模块以启动操作
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,SLAVE_ADDRESS);
//在传输模式下设置
EUSCI_B_I2C_setMode (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_mode);
EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_INTERRUPT0);
/*发送注册地址*/
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE,REG_ADDRESS);
//传送中断标志轮询。
while (!(HWREG16 (EUSCI_B0_BBASE + OFS_UCBxIFG)& UCTXIFG)&& retry)
{
重试--;
}
如果(!retry){
返回I2C_Time_Out;
}
/*在接收模式*/中设置eUSI_B0
EUSCI_B_I2C_setMode (EUSCI_B0_BBASE,EUSCI_B_I2C_Receive_mode);
DATA[0]=EUSI_B_I2C_masterReceiveSingleByte(EUSI_B0_BAC_base);
/*if(len==1){
DATA[0]=EUSI_B_I2C_masterReceiveSingleByte(EUSI_B0_BAC_base);
}
否则
{
EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE);
对于(i=0;i<len-1;i++)
Data[I]= EUSI_B_I2C_masterReceiveMultiByteNext(EUSI_B0_base);
Data[len-1]=EUSI_B_I2C_masterReceiveMultiByteFinish(EUSI_B0_BASE;
}*/
返回0;
}