嗨,我在 Atmel studio v6.1 为 AVR32 控制器 (AT32UC3A0512) 工作。我正在研究 I2C 以与相机(NanoCam C1U)设备进行通信。请注意,由于当 I2C 总线上的子系统准备好数据时,相机会自动发送 I2C 消息,因此总线必须在 I2C 多主模式下运行。因此不支持 I2C 从机模式。
下面是 I2C 多主通信的代码,我能够向相机发送数据,但无法从相机接收数据。请帮我在下面的代码中找到错误。
AVR32_TWI.CR.svdis = 1; //slave disable
AVR32_TWI.CR.msen = 1; //master enable
AVR32_TWI.MMR.dadr = 0x5; //OBC AVR32 address
void cam_snap(void)
{
const uint8_t CAMSnapCmd[2] = {0x84,0x65};
uint8_t CamSnapCmdOutput[70];
AVR32_TWI.CR.svdis=1; //slave disable
AVR32_TWI.CR.msen=1; //master enable
AVR32_TWI.MMR.dadr=0x6; //Camera slave device address.
AVR32_TWI.MMR.mread = 0; // write mode
lPayloadTimeout = PAYLOAD_TIMEOUT ;
AVR32_TWI.THR.txdata = CAMSnapCmd[0];
while(AVR32_TWI.SR.txrdy!=1)
{
if(lPayloadTimeout == 0)
return;
else
lPayloadTimeout--;
}
lPayloadTimeout = PAYLOAD_TIMEOUT ;
AVR32_TWI.THR.txdata=CAMSnapCmd[1];
while(AVR32_TWI.SR.txrdy!=1)
{
if(lPayloadTimeout == 0)
return;
else
lPayloadTimeout--;
}
lPayloadTimeout = PAYLOAD_TIMEOUT ;
while(AVR32_TWI.SR.txcomp!=1)
{
if(lPayloadTimeout == 0)
return;
else
lPayloadTimeout--;
}
AVR32_TWI.SMR.sadr=0x5; //OBC Master address AVR32
AVR32_TWI.CR.msdis=1;//master disable
AVR32_TWI.CR.sven=1;//slave enable
//AVR32_TWI.MMR.mread = 0;
for(int j =0; j< 65; j++)
{
lPayloadTimeout = PAYLOAD_TIMEOUT ;
while(AVR32_TWI.SR.rxrdy!=1)
{
if(lPayloadTimeout == 0)
return;
else
lPayloadTimeout--;
}
CamSnapCmdOutput[j] = AVR32_TWI.RHR.rxdata;
uint8_t test_result = CamSnapCmdOutput[0];
}
}