STM32单片机模拟IIC通用驱动程序
单片机代码
//=====================MRI2C.h===========================
#ifndef __MRI2C_H
#define __MRI2C_H
#include "stm32f10x.h"
#include "wei_bit.h" //位带操作
#define W_SCL PBout(8) // 定义输出SCL引脚
#define W_SDA PBout(9) //定义输出SDA引脚
#define R_SDA PBin(9) //定义SDA输入用于读取状态
// 如果要启用高速 I2C,则定义 IIC_HS 注释掉下面一行降速
#define IIC_HS
// 条件编译的代码
#ifdef IIC_HS //电平改变后无延时 最高速度 约300Khz
#define W_SCL_H W_SCL=1
#define W_SCL_L W_SCL=0
#define W_SDA_H W_SDA=1
#define W_SDA_L W_SDA=0
#else //电平改变后延时达到减低速度目的 约100Khz
#define W_SCL_H W_SCL=1 ; IIc_Delay(10) //SCL拉高 并延时
#define W_SCL_L W_SCL=0 ; IIc_Delay(10) //SCL拉低 并延时
#define W_SDA_H W_SDA=1 ; IIc_Delay(5) //SDA拉高 加延时
#define W_SDA_L W_SDA=0 ; IIc_Delay(5) //SDA拉低 并延时
#endif
#define PCF8575_ADDRESS 0x40 //IIC的I2C从机地址
#define PCF8574_ADDRESS 0x4E //IIC的I2C从机地址
#define PCF2129_ADDRESS 0xA2 //pcf2129
#define PCF8563_ADDRESS 0xA2 //pcf8563
#define R8025_ADDRESS 0x64 //R8025
extern uint8_t IIC_EEr ; //错误标志
extern void I2C1_Init(void); // IIC初始化
extern void I2C1_Reset(void); //I2C故障重启
extern void I2C1_Read (uint8_t ADDRESS , uint8_t addr,uint8_t *pData,uint8_t len);
extern void I2C1_Write(uint8_t ADDRESS , uint8_t addr,uint8_t *pData,uint8_t len);
#endif
//====================MRI2C.c========================
//***************模拟IIC程序************************************
/*无延时,最高速度,时钟脉宽1.25us,间歇2.5us */
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "MRI2C.h"
#include "stm32f10x_i2c.h"
uint8_t IIC_EEr = 0; //错误标志。
uint16_t EER_coner = 0; //错误计数器
//*********************************************************
void IIc_Delay(uint16_t ys)
{ uint16_t ystm;
ystm=ys;
while(ystm--){}
}
//产生IIC起始信号
void MyI2C_Start(void)
{
W_SDA_H;
W_SCL_H;
W_SDA_L;
W_SCL_L;
}
//产生IIC停止信号
void MyI2C_Stop(void)
{
W_SDA_L;
W_SCL_H;
W_SDA_H;
}

芯片解密