主题中讨论的其他部件:MOTORWARE
大家好,
我一直在尝试在Motorware Instaspin实验室中使用上述UC进行I2C通信。
我在网上找到了I2C驱动程序,我认为我有能力写入数据。 不幸的是,成功的好坏参半。 有时我根本无法在I2C线路上获得任何输出,有时它工作正常,奇怪的是,从字节和数据字节中的位会被一个向右移动。 在做了各种更改后,我甚至可以更长时间地得到这些信息。 I2C线路保持较高。
我认为设置代码正常工作,问题出在我的写入功能。 如果我注释掉,设备将不再处于"空闲"状态,电机将正常运行。 查看寄存器时(它们没有变化),I2CSTR为0x0420,MDR寄存器为0x0220。 我认为唯一值得注意的是SCD位已设置。
我将包括我更改的所有文件(hal,i2c等),以防它们有所帮助。 e2e.ti.com/.../I2CCode.zip
以下是写功能,因为我认为它是罪魁祸首:
void accel_Write(HAL_Handle halHandle, uint16_t register_add, uint16_t data ){
While (I2C_ISMasterBusy (halHandle->i2cHandle));
I2C_clearStopConditionDetection (halHandle->i2cHandle);
While (I2C_ISMasterStopBitSet (halHandle->i2cHandle));
while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}
I2c_putData(halHandle->i2cHandle, register_add);
I2C_MasterControl (halHandle->i2cHandle,I2C_Control_Single_TX,0,2);
//while (I2C_ISMasterBusy (halHandle->i2cHandle));
// while (!(I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_bits))));
//如果一个nisack/Handle/被清除
,则出现2I2I2I2Handle/I2I2_I2lle (I2hallle,且I2I2I2scle/清除了I2sclle (I2sHandlle
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
// I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
//}//
I2C_putData(halHandle->i2cHandle, register_add);
while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}
I2C_putData (halHandle->i2cHandle,数据);
while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}
while (!I2C_isStopConditionDetected(halHandle->i2cHandle));
}// Accel_Write()函数结束
While循环是确保数据在就绪时加载到输出移位寄存器并处理nacks的结果。
如果您能为您提供帮助,我将不胜感激。
谢谢!
Joshua Russell