1、使用i2c的引脚要设置成开漏输出,以防止烧坏芯片。
2、开漏输出可以将驱动器中的P-MOS失能,只有N-MOS工作。防止如果有两个i2c外设,一个要输出高电平,一个要输出低电平而形成短路状态。
1、驱动oled屏幕
1.1、配置
对照原理图选择对应的i2c使能即可。
1.2、驱动代码
下载链接:驱动代码
1.3、应用代码
OLED_Init();OLED_Clear();OLED_PrintString(0,0,"hello world!");
2、i2c读取mpu 6050寄存器
我要读取mpu605的0x75寄存器,该值默认是0x68。mpu6050的7位外设地址是0x68。
方式一:
uint8_t val;uint8_t reg = 0x75;HAL_I2C_Master_Transmit(&hi2c1, 0x68<<1, ®, 1, 100);HAL_I2C_Master_Receive(&hi2c1, 0x68<<1, &val, 1, 100);OLED_PrintHex(0, 4, val, 1);
方式二:
OLED_PrintString(0,0,"hello world");uint8_t val;HAL_I2C_Mem_Read(&hi2c1, 0x68<<1, 0x75, I2C_MEMADD_SIZE_8BIT, &val, 1,1000);OLED_PrintHex(0, 4, val, 1);
HAL_I2C_Mem_Read是HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive改进后的函数,本质没太大区别。效果如下:
3、中断方式
我们只需要在上面函数后加上_IT后缀即可,比如:HAL_I2C_Mem_Read_IT
在调用完后,i2c的读写操作就交给cpu执行,该函数会返回OK继续向下执行。需要等待中断读写完成后我们才能对数据进行操作。
读写完成时会调用CpltCallback回调函数。
/* MEM模式发送完成回调函数 */
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
{if (hi2c == &hi2c1){g_i2c1_tx_complete = 1;}
}/* MEM模式接收完成回调函数 */
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{if (hi2c == &hi2c1){g_i2c1_rx_complete = 1;}
}