unsigned char i2cMasterReceiveNI(unsigned char deviceAddr, unsigned char length, unsigned char *data)
{
unsigned char retval = I2C_OK
// 关I2C中断
TWCR&=~(1<<TWIE)
//发送开始条件
i2cSendStart()
i2cWaitForComplete()
// 发送器件读地址
i2cSendByte( deviceAddr | 0x01 )
i2cWaitForComplete()
// 检查器件是否可用
if( TWSR == TW_MR_SLA_ACK){
// 接收数据并回应
while(length >1){
i2cReceiveByte(TRUE)
i2cWaitForComplete()
*data++ = i2cGetReceivedByte()
length--
}
// 接收数据无回应 (末位信号)
i2cReceiveByte(FALSE)
i2cWaitForComplete()
*data++ = i2cGetReceivedByte()
}else{
// 如未回应器件地址,停止发送,返回错误
retval = I2C_ERROR_NODEV
}
// 发送停止条件,保持TWEA以便从接收
i2cSendStop()
// 开I2C中断
TWCR|=TWIE
return retval
}
首先,iic做从机的程序源码网上比较多,我就不发了,说下调试方法。相信主机部分已经调试通过了,在这个前提下,楼主的思路是没错的,接收非空,读数据。iic属于一个硬件接口,出问题的时候需要借助示波器,监测每个时候每个数据的波形,同时用JTAG在线调试,分析从机相关寄存器的状态,与自己计算的理论值做对比看是否正确,最终会找到一个出错的地方,看着一堆数据确实会枯燥一些,楼主加油,祝成功~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)