📄 i2c.c
字号:
/****************************************Copyright (c)**************************************************
**
** 北天星国际有限公司
** http://www.po-star.com
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**函数功能:给24C02里写入4个字节,在串口上打印出来;然后读出来,也在串口上打印出来
显示完后比较,如果不相等,蜂鸣器鸣叫;如果相等,LED闪烁
**说明:JP2_LED2连接上,J9连接上.实验前按复位键。保证复位i2c
********************************************************************/
#include "..\inc\config.h"
#define STA (1<<5)
#define I2CEN (1<<6)
#define STO (1<<4)
#define SI (1<<3)
#define AA (1<<2)
#define WRMode 0 //写控制位
#define RDMode 1 //读控制位
#define C02MasterAddr 0xA0 //24c02的器件地址
#define C02SlaveAddr 0 //24C02的子地址
#define lastbyte 1 //最后一位标志位
U8 I2C_buf1[10];
U8 I2C_buf2[10];
extern void UART0_PutString(char *str);
extern void UART0_PutChar ( U32 data);
extern void UART0_Init (void);
extern void PLL_Init(void);
/***********************i2c总线初始化*********************/
void I2C_Init(void)
{ /* 设置I2C时钟为100KHz */
I2SCLH = I2SCLL = 14; // 晶振为11.0592MHz,Fpclk = 2.7648MHz,I2C时钟速率=2.7648/28=100k
I2CONCLR=STA|SI|AA|STO;
I2CONSET=I2CEN; //I2EN=1,使能I2C功能
}
/*************************发送起始信号*********************/
void I2C_Start(void)
{
I2CONSET=STA; //启动发送START脉冲
//I2CONSET=SI; //发送完起始位会自动置1
do{}while(0x08!=I2CSTAT); //等待完成start脉冲发送
I2CONCLR=STA; //清除STA位,结束过程
}
/*****************发送结束信号*********************/
void I2C_Stop(void)
{
I2CONSET=STO; //启动发送STop脉冲,STO位是自动清除的.不必判断是否结束
I2CONCLR=SI; //只能清除SI,清除STO还是会有影响,STO同时清除,返回到初始化的状态
}
/************************延时*********************************/
void DelayMs(U32 dly)
{ U32 i;
for(; dly>0; dly--)
for(i=0; i<1000; i++);
}
/***************写8位数据*****************************/
void WriteByte(U8 data)
{
I2DAT=data;
I2CONCLR=SI; //启动发送
}
/***************写器件地址和读写信号*****************************/
void WriteAddr(U8 ReadMode)
{
WriteByte(C02MasterAddr+ReadMode);
if(ReadMode) do{}while(I2CSTAT!=0x40); //等待器件地址和读信号完成
else do{}while(I2CSTAT!=0x18); //等待器件地址和写信号完成
}
/***************写数据*****************************/
void WriteData(U8 data)
{
WriteByte(data);
do{} while(I2CSTAT!=0x28); //等待写数据完成
}
/***************读8位数据*****************************/
U8 ReadByte(U8 last) //last:最后一位数据
{
if(last)
{
I2CONCLR=AA;
I2CONCLR=SI; //启动接收最后数据
do{}while(I2CSTAT!=0X58);
}
else
{
I2CONSET=AA;
I2CONCLR=SI; //启动接收数据
do{}while(I2CSTAT!=0X50);
}
return I2DAT;
}
/***************写4个字节到24c02*****************************/
void WriteC02()
{
U8 i;
I2C_Start();
WriteAddr(WRMode); //写地址和写模式
WriteData(C02SlaveAddr); //24c02的存储地址
for(i=0;i<4;i++) I2C_buf1[i]=i+5; //I2C_buf初始化
for(i=0;i<4;i++)
{
WriteData(I2C_buf1[i]);
}
I2C_Stop();
DelayMs(10); // 延时等待eeprom写操作
//把写到I2C上的数据在串口上打印出来
DelayMs(100);
UART0_PutString(" \nWrite to I2C BUS:\n");
DelayMs(5000);
for(i=0;i<4;i++)
{
UART0_PutChar(I2C_buf1[i]+48);
UART0_PutString("\n");
DelayMs(5000);
}
}
/******************从24c02地址读4个字节数据************/
void ReadC02()
{
U8 i;
I2C_Start();
WriteAddr(WRMode);
WriteData(C02SlaveAddr);
I2C_Stop();
I2C_Start();
WriteAddr(RDMode);
for(i=0;i<4;i++) I2C_buf2[i]=0;
for(i=0;i<3;i++)
{
I2C_buf2[i]=ReadByte(!lastbyte);
}
I2C_buf2[3]=ReadByte(lastbyte);
I2C_Stop();
//把从I2C上读到的数据在串口上打印出来
UART0_PutString(" \nRead form I2C BUS:\n");
DelayMs(5000);
for(i=0;i<4;i++)
{
UART0_PutChar(I2C_buf2[i]+48);
UART0_PutString("\n");
DelayMs(5000);
}
}
/************************beep鸣叫********************/
void Beep()
{
while(1)
{IO0CLR=BEEP;
DelayMs(100);
IO0SET=BEEP;
DelayMs(10000);
}
}
/************************led闪烁******************/
void LedFlash()
{
while(1)
{IO0CLR=LED1CON;
DelayMs(500);
IO0SET=LED1CON;
DelayMs(500);
}
}
/*************************主函数*********************/
void main()
{
U8 i;
PINSEL0 = 0x00000055; // 设置I/O口工作模式,使用I2C0口,P0.2,P0.3。其余口为GPIO口
PINSEL1 = 0x00000000;
IO0DIR=LED1CON|BEEP;
IO0SET=LED1CON|BEEP;
PLL_Init();
I2C_Init(); //I2C初始化
UART0_Init();
WriteC02(); //往24C02写4个字节数据
DelayMs(10000);
ReadC02(); //从24C02把写进去的数读出来
UART0_PutString(" \nIf the data that write to and read from I2C BUS is equation,LED will flash\n");
DelayMs(10000);
UART0_PutString(" \nIf the data that write to and read from I2C BUS is not equation,buzzer will make sound\n");
DelayMs(10000);
/*********判断是否相等,并显示***************/
for(i=0;i<4;i++)
{
if(I2C_buf2[i]=I2C_buf1[i]) LedFlash();
else Beep();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -