1.打开I2c,使用默认参数
2.打开i2c的DMA,保持默认
3.打开i2c的中断
4.在项目管理里将DMA的初始化放到i2c初始化之前(很重要)
之后生成项目。
在oled的驱动中修改以下函数:
#define SSD1302_ADDR 0x78 //IIC通讯地址
#define WRITE_CMD 0x80 //控制字节指定下一个字节为命令 1000 0000b
#define WRITE_DATA 0x40 //控制字节指定下一个字节为数据 0100 0000b
void SSD1306_WriteCmd(uint8_t cmd)
{
uint8_t i2c_count = 0;
while(__HAL_I2C_GET_FLAG(&hi2c1, I2C_FLAG_BUSY)) //I2C忙
{
HAL_Delay(1);
i2c_count++;
if(i2c_count > 100)
break;
}
if(i2c_count < 100)
{
HAL_I2C_Mem_Write(&hi2c1, SSD1302_ADDR, WRITE_CMD, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 10);
}
}
uint8_t OLED_GRAM[128*8+1];
//更新图像到oled
void OLED_Refresh_Gram(void)
{
OLED_GRAM[0] = WRITE_DATA;
HAL_I2C_Master_Transmit_DMA(&hi2c1, SSD1302_ADDR, OLED_GRAM, 128*8+1);
}
//清屏函数
void OLED_Clear(void)
{
memset(OLED_GRAM,0,128*8+1);
OLED_Refresh_Gram();
}