历史上的今天
今天是:2025年08月08日(星期五)
2019年08月08日 | STM32硬件I2C问题
2019-08-08 来源:eefocus
1.CUBEMX生成代码后I2C总线初始化一直出现 I2C_FLAG_BUSE
1.1 环境:



1.2 硬件I2C配置为默认,管脚如下

1.3 时钟等其他 配置完成后生成工程
1.4 添加代码
在i2c.c文件中的的void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)函数中添加如下代码
__I2C2_FORCE_RESET();
__I2C2_RELEASE_RESET();
实际如下图

这里采用读取板载的MPU6050的设备地址来确认硬件I2C是否工作正常。 主函数里main.c添加程序如下:
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t device_id_reg = 0x75; //存放MPU6050设备地址的寄存器
uint8_t device_id = 0x68; //MPU6050设备地址,0x75寄存器读取的地址与此相同
uint8_t device_id_reg_ret; //用来存放读取的设备地址
/* USER CODE END PV */
在while循环里添加读取设备地址代码,效果如下:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint32_t cnt = 0;
HAL_Delay(10);
if(cnt%10==0)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin | LED1_Pin);
}
if(cnt%20==0)
{
HAL_I2C_Mem_Read(&hi2c1,device_id<<1 , 0X75, I2C_MEMADD_SIZE_8BIT,&device_id_reg_ret,1, 1000);//读MPU6050的ID
printf("MPU6050device_id %xrn",device_id_reg_ret);
}
cnt++;
}
编译下载后在串口可以看到打印信息:
与给定的设备地址相同,说明代码配置的硬件i2c可用
史海拾趣
|
1.中心频率为250KHz,带宽为100KHz(频率范围200KHz~~300KHz) 2.有源滤波器一般用到运放,应该选折何种运放,型号是什么? 3.通常情况下,是不是有源滤波器都能代替无源滤波器? 因为是手头上没有精确的电容和电感,电感一般都是 ...… 查看全部问答> |
|
\"89s51\" 在做好简单电路板时候 单片机不会起作用啊 里面我程序是P0 P1 P2 P3循环变1 0的 周期为2s 但是没有反应 是什么问题呢? 晶振12MHz(在开发板用的没问题的 ) 电容c为20 20 (用30 30也不行 ...… 查看全部问答> |
|
6410 2d加速的BitBLt运行不正常。弄过的兄弟给点建议 在linux 2.6.33上弄的,只想实现最简单的从一块区域拷贝到另外一块区域显示的功能。 将(linux 2.6.28的)中g2d部分的代码移植到了video s3c-fb中,通过io_ctrl实现的。但移植的代码更本不能使用。 然后自己按照手册,配置的寄存器。 从FIFO sta ...… 查看全部问答> |
|
求助:最近做了个8x8led对应8x8矩阵键盘 要求是:8x8led随机点亮,按下对应的按钮,灭掉该灯,亮下一个。 问题是:后面我画了个proteus仿真,没搞懂什么昨天正常,今天怎么检测不到键盘了?没找到问题 麻烦大家看下。。。,,,附上程序及仿真 ...… 查看全部问答> |




