TI中文支持网
TI专业的中文技术问题搜集分享网站

TM4C123的I2C失去总线控制??

不知有谁在I2C上研究得比较深 我读MPU9250设备ID 有时能读到有时候不能 我在读写函数的结尾加了条while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE)); 程序就卡这里了 我改成ERR_ARB_LOST就通过了 翻译过来是失去总线控制 出现这种错误会是什么原因啊

下面是我的读写函数 请各路高手检查下有没有错误

void MPU_Write_Byte(uint8_t addr,uint8_t reg,uint8_t data)
{
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
 I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
 while(I2CMasterBusy(I2C3_BASE));
 I2CMasterDataPut(I2C3_BASE,data);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
 while(I2CMasterBusy(I2C3_BASE));
 while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
}

uint8_t MPU_Read_Byte(uint8_t addr,uint8_t reg)
{
 uint8_t res;
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
  I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
 while(I2CMasterBusy(I2C3_BASE));
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
  I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);
  while(I2CMasterBusy(I2C3_BASE));
 while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
  res=I2CMasterDataGet(I2C3_BASE);
  return res;
}

void MPU_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
 uint32_t DataNumber;
 uint32_t MsterCMD;
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
 I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_SINGLE_SEND);
  while(I2CMasterBusy(I2C3_BASE));
  I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
 
 for(DataNumber=0;DataNumber<len;DataNumber++)
 {
  if(DataNumber==0)
  {
   MsterCMD=I2C_MASTER_CMD_BURST_RECEIVE_START;
  }
  else if(DataNumber==(len-1))
  {
   MsterCMD=I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH;
  }
  else
  {
   MsterCMD=I2C_MASTER_CMD_BURST_RECEIVE_CONT;
  }
  I2CMasterControl(I2C3_BASE,MsterCMD);
   while(I2CMasterBusy(I2C3_BASE));
  while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
  *buf=I2CMasterDataGet(I2C3_BASE);
  buf++;
 }

}

da qin zheng sheng:

使用硬件i2c还是模拟的?

da qin zheng sheng:

回复 da qin zheng sheng:

另外有条件用示波器测量一下波形。

da qin zheng sheng:

回复 da qin zheng sheng:

还有外部的上拉电阻多大?9250和mcu的连线远不?

xyz549040622:

同意大秦正声的,可能是距离太远,可能是驱动能力不够,在确保I2C上拉连接OK的基础上降低速率试试。

user5813287:

回复 da qin zheng sheng:

硬件的

user5813287:

回复 da qin zheng sheng:

外部上拉电阻不清楚 我9250买的模块

user5813287:

回复 xyz549040622:

距离和驱动能力应该没有问题 因为我之前能读出设备ID的 不知道什么原因现在不行了 我是用开发板的USB接口供的电 应该够啊

xyz549040622:

回复 user5813287:

上拉加了吗?试试iO模拟看看

user5813287:

回复 xyz549040622:

我是直接用杜邦线跟9250模块连接的 上没上拉我不清楚 我加了条MasterBusBusy语句 程序也卡在这里了 看来I2C总线被占用了 现在不知道谁占用的 我只初始化了一个I2C3啊

xyz549040622:

回复 user5813287:

你这个问题
1.I2C协议规定,I2C必须要加上拉电阻的,你需要确定9250模块I2C总线上是否有上拉电阻,没有的话需要加上。STM32能通讯并不代表这个上拉电阻是不必要的。
2.你TM4的板子是什么板子,自己做的还是官方的开发板,方便的话拍个照片看看。

赞(0)
未经允许不得转载:TI中文支持网 » TM4C123的I2C失去总线控制??
分享到: 更多 (0)