📄 iic.c
字号:
#include "config.h"
#define BIT(x) (1 << x)
#define I2C_EN BIT(6)
#define I2C_STA BIT(5)
#define I2C_STO BIT(4)
#define I2C_SI BIT(3)
#define I2C_AA BIT(2)
#define EEPROM_WRITE 0xA0
#define EEPROM_READ 0xA1
/*********************************************************************************************************
** 函 数 名:void InitEEPROM(void)
** 入口参数:无
** 出口参数:无
** 功能描述:iic初始化函数
********************************************************************************************************/
void InitEEPROM(void)
{
I2C0SCLH = (Fpclk/100000 + 1) / 2;//设置SCL高电平占空比
I2C0SCLL = (Fpclk/100000) / 2;//设置SCL低电平占空比
I2C0CONCLR = I2C_STA | I2C_STO | I2C_SI | I2C_AA;//设计清零寄存器
I2C0CONSET = I2C_EN;//使能IIC接口,设置接口模式
}
/****************************************************
** 函 数 名:void AddressEEPROM(unsigned char ChipID, unsigned short Address)
** 入口参数:ChipID - 芯片ID号
Address - EEPROM寄存器地址
** 出口参数:无
** 功能描述:设置访问的地址,EEPROM 芯片ID号已经固定为0
*******************************************************/
void AddressEEPROM(unsigned char ChipID, unsigned short Address)
{
volatile unsigned int s;
do
{
I2C0CONSET = I2C_STA | I2C_SI; //设置进入主模式的起始条件
I2C0CONCLR = I2C_SI; //发送起始条件
s = I2C0CONSET;
while (~ I2C0CONSET & I2C_SI)
s= I2C0CONSET; //等待起始条件发送
I2C0DAT = EEPROM_WRITE | (ChipID & 0x7) << 1; //设置芯片从地址
I2C0CONCLR = I2C_STA | I2C_SI; //发送芯片从地址
while (~ I2C0CONSET & I2C_SI); //等待芯片从地址发送
s= I2C0STAT;
}while ( I2C0STAT != 0x18); //如果EEPROM没有应答再次循环发送
I2C0DAT = Address & 0xFF; //设置EEPROM存储地址
I2C0CONCLR = I2C_SI; //发送EEPROM存储地址
while (~ I2C0CONSET & I2C_SI); //等待发送完毕
} //AddressEEPROM
/****************************************************
** 函 数 名:void WriteEEPROM(unsigned char ChipID, unsigned short Address, unsigned char Data)
** 入口参数:ChipID - 芯片ID号
Address - EEPROM寄存器地址
Data - 待写入的数据
** 出口参数:无
** 功能描述:向EEPROM写入数据
*******************************************************/
void WriteEEPROM(unsigned char ChipID, unsigned short Address, unsigned char Data)
{
AddressEEPROM(ChipID, Address);//设置要访问的地址
I2C0DAT = Data; //设置将要发送的数据
I2C0CONCLR = I2C_SI; //发送数据
while (~ I2C0CONSET & I2C_SI); //等待发送结束
I2C0CONSET = I2C_STO; //安装停止条件
I2C0CONCLR = I2C_SI; //发送停止位
while ( I2C0CONSET & I2C_STO); //等待停止位发送完毕
}
/****************************************************
** 函 数 名:unsigned char ReadEEPROM (unsigned char ChipID)
** 入口参数:ChipID - 芯片ID号
Address - EEPROM寄存器地址
** 出口参数:返回读出的数据
** 功能描述:读EEPROM数据
*******************************************************/
unsigned char ReadEEPROM (unsigned char ChipID, unsigned short Address)
{
unsigned char Data;
AddressEEPROM(ChipID, Address);//设置要访问的地址
do {
I2C0CONSET = I2C_STA | I2C_SI; //安装起始条件
I2C0CONCLR = I2C_SI; //发送起始条件
while (~ I2C0CONSET & I2C_SI); //等待起始条件发送完毕
I2C0DAT = EEPROM_READ|(ChipID& 0x07)<<1; //设置芯片从地址
I2C0CONCLR = I2C_STA | I2C_SI; //发送芯片从地址
while (~ I2C0CONSET & I2C_SI); //等待芯片从地址发送
} while ( I2C0STAT != 0x40); //如果没收到应答,重复发送
I2C0CONCLR = I2C_SI; //开始读数据
while (~ I2C0CONSET & I2C_SI); //等待接收数据
Data = I2C0DAT;
I2C0CONSET = I2C_STO; //安装停止条件
I2C0CONCLR = I2C_SI; //发送停止位
while ( I2C0CONSET & I2C_STO); //等待停止位发送完毕
return Data; //返回所读的数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -