OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4810|回复: 6

求助HAL库 IIC的DMA传输字节限制问题。

[复制链接]

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-12-30
在线时间
32 小时
发表于 2018-8-27 18:11:23 | 显示全部楼层 |阅读模式
1金钱
今天测试用IIC驱动SSD1306的12864OLED.
使用轮询模式IIC发送整屏一切正常,但是使用DMA模式发送,只发送出前面大概200多个字节,后面就发不出去了,时钟信号也被拉低没有变高。
DMA是普通模式。之前也用DMA读写IIC的传感器,但是字节数很少,没出过问题,这次全屏操作不问题了,不知前辈们有何办法。(拒绝模拟IIC,速度太慢)

整个程序只有IIC的OLED操作,不存在被打断的问题吧。。。

HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, BMP1, 128*8, 1000);//轮询正常
HAL_Delay(50);
HAL_I2C_Mem_Write_DMA(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, BMP1, 128*8);//DMA不正常

下面是逻辑分析仪的显示
逻辑分析图.JPG
前面一段很长的是用轮询方式发送的,屏幕现象和逻辑分析都正常。后面一段是用DMA发送的,发送了一点后就停了,而且时钟线也被锁在了低。
下图是DMA传输结束时候的细节。
问题处细节.JPG


在stm32f3xx_hal_i2c.c中,关于size超过255的处理是这样的:
轮询方式中:
***************无关代码*************
    hi2c->XferCount = Size;

***************无关代码*************


    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
    if (hi2c->XferCount > MAX_NBYTE_SIZE)
    {
      hi2c->XferSize = MAX_NBYTE_SIZE;
      I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
    }
    else
    {
      hi2c->XferSize = hi2c->XferCount;
      I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
    }

***************无关代码*************



然后进入循环,没法送一个hi2c->XferCount--,这样吧所有数据发送完。


在DMA方式中:


***************无关代码*************


    hi2c->XferCount   = Size;


***************无关代码*************



if (hi2c->XferCount > MAX_NBYTE_SIZE)
    {
      hi2c->XferSize = MAX_NBYTE_SIZE;
      xfermode = I2C_RELOAD_MODE;
    }
    else
    {
      hi2c->XferSize = hi2c->XferCount;
      xfermode = I2C_AUTOEND_MODE;
    }

***************无关代码*************



    /* Send Slave Address */
    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
    I2C_TransferConfig(hi2c, DevAddress, hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
    /* Update XferCount value */
    hi2c->XferCount -= hi2c->XferSize;


***************无关代码*************







也没有循环,然后这这么两句就完了, I2C_TransferConfig传入了xfermode,但是



static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c,  uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
{
  /* Check the parameters */
  assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
  assert_param(IS_TRANSFER_MODE(Mode));
  assert_param(IS_TRANSFER_REQUEST(Request));
  /* update CR2 register */
  MODIFY_REG(hi2c->Instance->CR2, ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | I2C_CR2_START | I2C_CR2_STOP)), \
             (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | (uint32_t)Mode | (uint32_t)Request));
}



这个里面我就在看不懂了。不知道是哪里出的问题,应该如何配置,请求各路大侠指点。
我的工程在百度云分享里,接线就是默认的PB6和PB7。
链接:https://pan.baidu.com/s/1UMNmUNI_a79-PGt5Byd-Nw 密码:sxgb



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-12-30
在线时间
32 小时
 楼主| 发表于 2018-8-27 18:35:56 | 显示全部楼层
串口DMA发送同样长度的数据完全正常。
串口使用460800的波特率接近400K的IIC速度,方便看长度
串口正常.JPG
上图是测试结果,串口DMA发送(中间那一行)所有数据都发出来了,靠后是IIC的DMA,还是不行。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-28 01:37:53 | 显示全部楼层
帮顶
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-28 12:29:48 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2019-2-21
在线时间
16 小时
发表于 2019-9-21 16:03:54 | 显示全部楼层
请问楼主解决问题了吗?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-5-5
在线时间
6 小时
发表于 2020-5-29 10:36:45 | 显示全部楼层
楼主我最近也做这个iic dma,也是OLED,奇怪的是和你一样的调用DMA发送不出数据,想看看你的工作,但你连接失效了,可以加QQ940700962讨论下吗, 谢谢
回复

使用道具 举报

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-12-30
在线时间
32 小时
 楼主| 发表于 2020-6-17 09:55:13 | 显示全部楼层
18576004821 发表于 2020-5-29 10:36
楼主我最近也做这个iic dma,也是OLED,奇怪的是和你一样的调用DMA发送不出数据,想看看你的工作,但你连接 ...

好久没搞了,问题没有解决。所以大数据流的IIC还是用轮询方法比较靠谱。这可能也是正点原子的IIC教程全部都是软件模拟IIC的方式的原因。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 09:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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