搜索
bottom↓
回复: 9

stm32f4硬件i2c+DMA读mpu6050单步调试能过,运行卡住

[复制链接]

出0入0汤圆

发表于 2014-2-17 21:11:46 | 显示全部楼层 |阅读模式
stm32f4硬件i2c+DMA读mpu6050单步调试能过,运行卡住
以下是卡住代码部分,希望有经验的朋友指导指导!
u32 I2C_DMA_Read( u8 SlaveAddr, u8 ReadAddr, u8* NumByte ,u8* ReadBuf)
{
  I2C_ReadPtr = NumByte;

  I2C_TimeCnt = I2C_TIME;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_GenerateSTART(I2C1, ENABLE);

  I2C_TimeCnt = I2C_TIME;
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_Send7bitAddress(I2C1, SlaveAddr, I2C_Direction_Transmitter);

  I2C_TimeCnt = I2C_TIME;
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))//卡住在此处!单步进入函数又可以通过!
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_SendData(I2C1, ReadAddr);

  I2C_TimeCnt = I2C_TIME;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET)
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_GenerateSTART(I2C1, ENABLE);

  I2C_TimeCnt = I2C_TIME;
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_Send7bitAddress(I2C1, SlaveAddr, I2C_Direction_Receiver);

  if((u16)(*NumByte) < 2) {
  I2C_TimeCnt = I2C_TIME;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET)
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_AcknowledgeConfig(I2C1, DISABLE);
  (void)I2C1->SR2;

  I2C_GenerateSTOP(I2C1, ENABLE);

  I2C_TimeCnt = I2C_TIME;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET)
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  *ReadBuf = I2C_ReceiveData(I2C1);

  (u16)(*NumByte)--;

  I2C_TimeCnt = I2C_TIME;
  while(I2C1->CR1 & I2C_CR1_STOP)
    if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  I2C_AcknowledgeConfig(I2C1, ENABLE);
  }
  else {
    I2C_TimeCnt = I2C_TIME;
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
      if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

    DMA_InitStruct.DMA_Channel = DMA_Channel_1;
    DMA_InitStruct.DMA_PeripheralBaseAddr = (u32)I2C1_DR_Address;
    DMA_InitStruct.DMA_Memory0BaseAddr = (u32)ReadBuf;
    DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStruct.DMA_BufferSize = (u32)(*NumByte);
    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;
    DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Enable;
    DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA1_Stream0, &DMA_InitStruct);

    I2C_DMALastTransferCmd(I2C1, ENABLE);

    DMA_Cmd(DMA1_Stream0, ENABLE);
  }

  I2C_TimeCnt = I2C_TIME;
  while(*NumByte > 0)
  if((I2C_TimeCnt--) == 0)        return I2C_TimeOut();

  return SUCCESS;
}

卡住部分后面的各个while进入后单步都能过,一点run就会卡住,难道是硬件i2c+DMA太快?MPU6050响应不了这么快?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出400入0汤圆

发表于 2014-2-17 21:28:20 | 显示全部楼层
看看iic速率是不是太高了。high speed我记得是要先在低速模式初始化的

出0入0汤圆

 楼主| 发表于 2014-2-17 22:44:40 | 显示全部楼层
rainyuoko 发表于 2014-2-17 21:28
看看iic速率是不是太高了。high speed我记得是要先在低速模式初始化的

你是说低速模式初始化6050?麻烦详解!

出400入0汤圆

发表于 2014-2-17 23:21:12 | 显示全部楼层
杨大侠 发表于 2014-2-17 22:44
你是说低速模式初始化6050?麻烦详解!

你仔细看看6050手册应该会有初始化说明的,还有iic协议手册。

出0入0汤圆

发表于 2014-2-27 13:45:13 | 显示全部楼层
楼主这个问题解决了吗?现在我在调试这个程序的时候也是卡在这里。

出0入0汤圆

发表于 2014-3-11 10:43:08 | 显示全部楼层
同问这个问题,楼主你解决了吗?希望能得到你的指导。

出0入0汤圆

 楼主| 发表于 2014-3-11 11:20:35 | 显示全部楼层
Mac_Alex 发表于 2014-3-11 10:43
同问这个问题,楼主你解决了吗?希望能得到你的指导。

办法就是不要使用DMA,在合适的时机打开和关短buf的中断,祝你好运。

出0入0汤圆

发表于 2014-3-12 11:32:16 | 显示全部楼层
杨大侠 发表于 2014-3-11 11:20
办法就是不要使用DMA,在合适的时机打开和关短buf的中断,祝你好运。

楼主行行好,我最近也在调这个,也是用i2c读取MPU6050的数据,老板非要用硬件接口。我这两天一直没调通。楼主给分驱动吧。

出0入0汤圆

发表于 2014-3-13 14:13:23 | 显示全部楼层
STM的I2C是狗屎。。。。

出0入0汤圆

发表于 2014-3-26 14:26:59 | 显示全部楼层
楼主这个问题有没有解决  我的问题是 用硬件IIC能单字节写单字节读 就是不能多字节读          用模拟iic居然不能写不能读
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 06:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表