理论
参考51单片机IIC理论:链接
在起始信号后必须发送一个7位从机地址 + 1位方向位,用“0”表示主机发送数据,“1”表示主机接收数据
代码编写
IIC三个模式配置
IIC(阻塞模式)配置
主要方式
IIC(中断模式)配置
IIC(DMA模式)配置
阻塞模式
mian.c
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); //75行
MX_I2C1_Init();
/* USER CODE BEGIN Init */
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowCHinese(0,0,0); //�?
OLED_ShowCHinese(18,0,1); //�?
OLED_ShowCHinese(36,0,2); //�?
OLED_ShowCHinese(54,0,3); //�?
OLED_ShowCHinese(72,0,4); //�?
OLED_ShowCHinese(90,0,5); //�?
OLED_ShowCHinese(108,0,6); //�?
OLED_ShowCHinese(0,2,6); //�?
/* USER CODE END Init */
olde.c
/**********************************************
// IIC Write Command命令
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command) //10行
{
// IIC_Start();
// IIC_Write_Byte(0x78); //Slave address,SA0=0
// IIC_Write_Byte(0x00); //write command
// IIC_Write_Byte(IIC_Command);
// IIC_Stop();
uint8_t IIC_Send_Cmd[]={0x00,IIC_Command}; //将两个数据放进数组
/* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
* 参数2:设备地址,参数3:
* 参数4:要发送的数据量,参数5:超时持续时间
*/
HAL_I2C_Master_Transmit(&hi2c1, 0x78, IIC_Send_Cmd, 2, 100); //调用库函数阻塞发送IIC
}
/**********************************************
// IIC Write Data数据
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
// IIC_Start();
// IIC_Write_Byte(0x78); //D/C#=0; R/W#=0
// IIC_Write_Byte(0x40); //write data
// IIC_Write_Byte(IIC_Data);
// IIC_Stop();
uint8_t IIC_Send_Data[]={0x40,IIC_Data}; //将两个数据放进数组
/* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
* 参数2:设备地址,参数3:
* 参数4:要发送的数据量,参数5:超时持续时间
*/
HAL_I2C_Master_Transmit(&hi2c1, 0x78, IIC_Send_Data, 2, 100);
}
中断模式
mian.c与阻塞相同
oled.c
/**********************************************
// IIC Write Command命令
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command) //10行
{
// IIC_Start();
// IIC_Write_Byte(0x78); //Slave address,SA0=0
// IIC_Write_Byte(0x00); //write command
// IIC_Write_Byte(IIC_Command);
// IIC_Stop();
uint8_t IIC_Send_Cmd[]={0x00,IIC_Command}; //将两个数据放进数组
/* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
* 参数2:设备地址,参数3:
* 参数4:要发送的数据量
*/
HAL_I2C_Master_Transmit_IT(&hi2c1, 0x78, IIC_Send_Cmd, 2);
HAL_Delay(1); //如果不延时发太快不显示,但OLED显示太慢
}
/**********************************************
// IIC Write Data数据
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
// IIC_Start();
// IIC_Write_Byte(0x78); //D/C#=0; R/W#=0
// IIC_Write_Byte(0x40); //write data
// IIC_Write_Byte(IIC_Data);
// IIC_Stop();
uint8_t IIC_Send_Data[]={0x40,IIC_Data}; //将两个数据放进数组
/* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
* 参数2:设备地址,参数3:
* 参数4:要发送的数据量
*/
HAL_I2C_Master_Transmit_IT(&hi2c1, 0x78, IIC_Send_Data, 2);
HAL_Delay(1);
}