硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4982|回复: 22
收起左侧

[I2C] STM32H7的硬件I2C fast mode 速度不能到400K?

[复制链接]

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-8-29 14:49:10 | 显示全部楼层 |阅读模式
STM32H7的硬件I2C HAL库 cubemx配置的400K的速度 逻辑分析仪实测只有大约280K左右 这是什么鬼?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-29 14:53:00 | 显示全部楼层
你的HSE_VALUE大小跟你实际晶振的大小匹配吗,你的I2C的频率有没有做分频之类的操作,或者HAL库里面某个地方配置了一下。

硬件I2C就是这么坑,一路坑到H7。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2018-8-29 14:59:23 | 显示全部楼层
eric2013 发表于 2018-8-29 14:53
你的HSE_VALUE大小跟你实际晶振的大小匹配吗,你的I2C的频率有没有做分频之类的操作,或者HAL库里面某个地 ...

用的NUCLEO-H7  HSI TIM截图20180829145837.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-29 15:31:23 | 显示全部楼层
oneV 发表于 2018-8-29 14:59
用的NUCLEO-H7  HSI

帮你测试了,是370KHz左右。这个使用的内部上拉,OD开漏

一个周期
QQ截图20180829153225.png
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2018-8-29 15:49:23 | 显示全部楼层
eric2013 发表于 2018-8-29 15:31
帮你测试了,是370KHz左右。这个使用的内部上拉,OD开漏

一个周期

那你的还是可以的 至少不会差那么多。可否看一下你的cubemx的配置?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-29 15:55:38 | 显示全部楼层
oneV 发表于 2018-8-29 15:49
那你的还是可以的 至少不会差那么多。可否看一下你的cubemx的配置?

我用的NUCLEO自带的例子测试,你测试下看看,然后找找问题。

我现在还没有试过CubeMX生成例子。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2018-8-29 15:59:45 | 显示全部楼层
本帖最后由 oneV 于 2018-8-29 16:22 编辑
eric2013 发表于 2018-8-29 15:55
我用的NUCLEO自带的例子测试,你测试下看看,然后找找问题。

我现在还没有试过CubeMX生成例子。

OK 多谢          字数


还是自己设置的问题,看了ST的例程,改了timing,OK了  现在是标准的400K
TIM截图20180829161854.png
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2018-8-30 09:17:19 | 显示全部楼层
eric2013 发表于 2018-8-29 15:31
帮你测试了,是370KHz左右。这个使用的内部上拉,OD开漏

一个周期

你这个示波器抓的SCK波形怎么这么差
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2018-8-30 09:53:15 | 显示全部楼层
这个和人家单片机有啥关系啊,你硬件外面的上拉电阻多大?应该是总线的上拉电阻太大了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-30 10:03:08 | 显示全部楼层
gnail092 发表于 2018-8-30 09:17
你这个示波器抓的SCK波形怎么这么差

是不是不好意思说,为什么H7输出的波形这么差

如果要是推挽输出的话,几MHz都没有问题,波形比较棒。

这个是因为我测试的是用的开漏,内部上拉,而这个内部上拉电阻的典型值有40K欧,太大了。一般情况下10K以下就行,实测阻值越大上升沿时间越长。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-30 10:04:59 | 显示全部楼层
dzc0426 发表于 2018-8-30 09:53
这个和人家单片机有啥关系啊,你硬件外面的上拉电阻多大?应该是总线的上拉电阻太大了。

是的,这个用的是芯片内部上拉电阻,典型值有40KΩ,比较大。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2018-8-30 11:11:10 | 显示全部楼层
我用示波器测试也是这种超级烂的波形。


有一个问题是:
ST的例程是timing为0x00901954:
/* I2C TIMING Register define when I2C clock source is APB1 (SYSCLK/4) */
/* I2C TIMING is calculated in case of the I2C Clock source is the APB1CLK = 100 MHz */
/* This example use TIMING to 0x00901954 to reach 400 kHz speed (Rise time = 100 ns, Fall time = 10 ns) */

但是,我用cubemx死活配不出这个值来
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2018-8-30 13:48:40 | 显示全部楼层
eric2013 发表于 2018-8-30 10:04
是的,这个用的是芯片内部上拉电阻,典型值有40KΩ,比较大。

所以这种波形不能赖st,是硬件设计的时候失误,iic要跑高速还用内部上拉电阻。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-30 13:52:42 | 显示全部楼层
dzc0426 发表于 2018-8-30 13:48
所以这种波形不能赖st,是硬件设计的时候失误,iic要跑高速还用内部上拉电阻。

是的,这个是官方NUCLEO板子设计的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-8-30 13:54:55 | 显示全部楼层
oneV 发表于 2018-8-30 11:11
我用示波器测试也是这种超级烂的波形。

你再研究研究,I2C我还没有开始研究,另外注意一点,官方提供的例子,注释经常有错误,不可尽信。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2018-8-30 21:24:26 | 显示全部楼层
貌似上拉电阻一直没有被楼主重视,还在瞎搞!
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2018-8-31 10:29:45 | 显示全部楼层
laofa 发表于 2018-8-30 21:24
貌似上拉电阻一直没有被楼主重视,还在瞎搞!

搞I2C首先想到的就是上拉电阻   谢谢~
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2018-8-31 23:20:56 | 显示全部楼层
oneV 发表于 2018-8-31 10:29
搞I2C首先想到的就是上拉电阻   谢谢~

那你现在的上拉电阻了多少k?
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-13 21:14:24 | 显示全部楼层
oneV 发表于 2018-8-30 11:11
我用示波器测试也是这种超级烂的波形。

我也是卡在这硬件IIC了,CUBEMX怎么都配不出来,能否分享一下代码,非常感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2018-9-14 09:32:27 | 显示全部楼层
KAIXIN 发表于 2018-9-13 21:14
我也是卡在这硬件IIC了,CUBEMX怎么都配不出来,能否分享一下代码,非常感谢!

使用HAL库里面自带的例子就行。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-14 10:32:11 | 显示全部楼层
eric2013 发表于 2018-9-14 09:32
使用HAL库里面自带的例子就行。

OK了,搞半天是IIC的两个引脚插错了,
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-15 00:51:22 | 显示全部楼层
eric2013 发表于 2018-9-14 09:32
使用HAL库里面自带的例子就行。

硬件IIC dma程序不知道为什么,读出来都是0!  不用DMA可以正常使用

cubemx 生成的


#include "main.h"
#include "stm32h7xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_tx;
DMA_HandleTypeDef hdma_i2c1_rx;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART1_UART_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

#define EEPROM_ADDRESS          0xA0   /* Address A0 == MB1020 A-01 - Address A6 == MB1020 A-02 */
#define EEPROM_PAGESIZE         4     /* RF EEPROM ANT7-M24LR used */

#define  RXBUFFERSIZE   1
uint8_t usart_aRxBuffer[RXBUFFERSIZE];

uint8_t I2c_Buf_Write[256]={0};
uint8_t I2c_Buf_Read[256]={0};

#define I2C_XFER_TIMEOUT_MAX    300
#define EEPROM_MAX_TRIALS       300

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

        uint16_t i;
       
  /* USER CODE END 1 */

  /* Enable I-Cache-------------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache-------------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("待写入的数据:\n");   
        for ( i=0; i<256; i++ ) //填充缓冲
  {
    I2c_Buf_Read=0;      // 清空接收缓冲区
    I2c_Buf_Write = i;   // 为发送缓冲区填充数据
    printf("%4d ", I2c_Buf_Write);
    if(i%16 == 15)   
        printf("\n");
  }
        uint16_t Memory_Address;
        int32_t Remaining_Bytes;
        Remaining_Bytes = 256;
  Memory_Address = 0;
  while (Remaining_Bytes > 0)
  {   
    if(HAL_I2C_Mem_Write_DMA(&hi2c1 , (uint16_t)EEPROM_ADDRESS, Memory_Address, I2C_MEMADD_SIZE_16BIT, (uint8_t*)(I2c_Buf_Write + Memory_Address),EEPROM_PAGESIZE)!= HAL_OK)
    {
      printf("写入错误\n");
    }
    /* Check if the EEPROM is ready for a new operation */
    while (HAL_I2C_IsDeviceReady(&hi2c1, EEPROM_ADDRESS, EEPROM_MAX_TRIALS, I2C_XFER_TIMEOUT_MAX) != HAL_OK);
    Remaining_Bytes -= EEPROM_PAGESIZE;
    Memory_Address += EEPROM_PAGESIZE;
  }
        printf("写入成功,现在读出的数据:\n");
       
  if (HAL_I2C_Mem_Read_DMA(&hi2c1, (uint16_t)EEPROM_ADDRESS, 0, I2C_MEMADD_SIZE_16BIT, (uint8_t *)I2c_Buf_Read, 256) != HAL_OK)
  {
    printf("接收错误\n");
  }
        for( i=0; i<256; i++ )
  {
    if(i%16 == 15)   
        printf("\n");
                printf("%d ",I2c_Buf_Read);
        }
               
        printf("EEPROM(AT24C256) IIC_DMA 读写测试成功\n\r");




~9%UM`_R[J8B)5G}FDPG31Z.jpg
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2019-1-4 10:18:55 | 显示全部楼层
看楼上各位。感觉H7的I2C 硬件中断模式能用了? 400K也比模拟IO好吧。   还需要优先级必须最高不? 稳定性如何。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 08:18 , Processed in 0.237773 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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