本文介绍了在STM32下的IIC的基本使用方法,通过对板载具备IIC接口EEPROM的读写,完成对IIC驱动程序的测试。
硬件平台:STM32F107VCT6开发板
软件平台:STM32Cube MX + MDK5.22
1. 进行STM32Cube MX的配置
配置PB6和PB7为输出模式,同时配置了USART1进行串口调试使用。然后生成工程。
2. 打开工程,可以看到GPIO的初始化状态
3. 模拟IIC驱动程序源文件代码
/**
* @file iic_dup.c
* @brief IIC上层程序
* @par date version author remarks
* 2016-03-21 v1.0 zbt 初次创建
*
*/
/** 头文件包含区 ------------------------------------------------ */
#include "iic_dup.h"
/** 私有宏(类型定义) -------------------------------------------- */
#define IIC1_SCL(pin_status) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, pin_status);
#define IIC1_SDA(pin_status) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, pin_status);
#define IIC1_SCL_IS_HIGH() (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) != GPIO_PIN_RESET)
#define IIC1_SDA_IS_HIGH() (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) != GPIO_PIN_RESET)
/** 私有变量 --------------------------------------------------- */
/** 外部变量 --------------------------------------------------- */
/** 私有函数原型 ----------------------------------------------- */
static void iic_delay(void);
/** 公有函数 --------------------------------------------------- */
/**
* @brief IIC启动
* @param None
* @retval None
* @note 当SCL处于高电平状态时,SDA出现一个下降沿
即产生IIC启动信号
*/
void iic_start(void)
{
IIC1_SCL(GPIO_PIN_SET);
/** SDA产生一个下降沿 */
IIC1_SDA(GPIO_PIN_SET);
iic_delay();
IIC1_SDA(GPIO_PIN_RESET);
iic_delay();
IIC1_SCL(GPIO_PIN_RESET); /**< 拉低准备发送数据 */
iic_delay();
}
/**
* @brief IIC停止
* @param None
* @retval None
* @note 当SCL处于高电平状态时,SDA出现一个上升沿
即产生IIC停止信号
*/
void iic_stop(void)
{
IIC1_SCL(GPIO_PIN_RESET);
iic_delay();
/** SDA产生一个上升沿 */
IIC1_SDA(GPIO_PIN_RESET);
iic_delay();
IIC1_SCL(GPIO_PIN_SET);
iic_delay();
IIC1_SDA(GPIO_PIN_SET);
iic