本帖最后由 feelingwangman 于 2013-3-21 10:17 编辑
如题,请教高手帮忙看看吧
程序单步就停在等待完成start处,用的ADS
********************************************************************************************************
**函数功能:给24C02里写入4个字节,在串口上打印出来;然后读出来,也在串口上打印出来
显示完后比较,如果不相等,蜂鸣器鸣叫;如果相等,LED闪烁
**说明:JP2_LED1连接上,J9连接上.实验前按复位键。保证复位i2c
********************************************************************/
#include "config.h"
#define STA (1<<5)
#define I2CEN (1<<6)
#define STO (1<<4)
#define SI (1<<3)
#define AA (1<<2)
#define SDA1 (1<<18)
#define SCL1 (1<<17)
#define WP (1<<26)
#define WRMode 0 //写控制位
#define RDMode 1 //读控制位
#define C02MasterAddr 0xA0 //24c02的器件地址
#define C02SlaveAddr 0 //24C02的子地址
#define lastbyte 1 //最后一位标志位
#define LED1 (1<<2)
#define LED2 (1<<3)
uint8 I2C_buf1[10];
uint8 I2C_buf2[10];
uint8 i;
extern void UART0_PutString(char *str);
extern void UART0_PutChar ( uint32 data);
extern void UART0_Init (void);
extern void PLL_Init(void);
/***********************i2c总线初始化*********************/
void I2C_Init(void)
{ /* 设置I2C时钟为100KHz */
I2SCLH = I2C1SCLL = 14; // 晶振为11.0592MHz,Fpclk = 2.7648MHz,I2C时钟速率=2.7648/28=100k
I2CONCLR=0x3c; //STA|SI|AA|STO;
I2CONSET=0x40; //I2CEN; //I2EN=1,使能I2C功能
}
/*************************发送起始信号*********************/
void I2C_Start(void)
{
//I2C1CONSET=AA; //自己加的
I2CONSET|=0x20; //STA; //启动发送START脉冲
//I2CONSET=SI; //发送完起始位会自动置1
do{}while(0x08!=I2STAT); //等待完成start脉冲发送
I2CONCLR=STA; //清除STA位,结束过程
/*IOCLR = WP;
IOSET = SDA1;
IOSET = SCL1;
IOCLR = SDA1;
IOCLR = SCL1;*/
}
/*****************发送结束信号*********************/
void I2C_Stop(void)
{
I2CONSET=STO; //启动发送STop脉冲,STO位是自动清除的.不必判断是否结束
I2CONCLR=SI; //只能清除SI,清除STO还是会有影响,STO同时清除,返回到初始化的状态
}
/************************延时*********************************/
void DelayMs(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<1000; i++);
}
/***************写8位数据*****************************/
void WriteByte(uint8 data)
{
I2DAT=data;
I2CONCLR=SI; //启动发送
}
/***************写器件地址和读写信号*****************************/
void WriteAddr(uint8 ReadMode)
{
WriteByte(C02MasterAddr+ReadMode);
if(RDMode) do{}while(I2STAT!=0x40); //等待器件地址和读信号完成
else do{}while(I2STAT!=0x18); //等待器件地址和写信号完成
}
/***************写数据*****************************/
void WriteData(uint8 data)
{
WriteByte(data);
do{} while(I2STAT!=0x28); //等待写数据完成
}
/***************读8位数据*****************************/
uint8 ReadByte(uint8 last) //last:最后一位数据
{
if(last)
{
I2CONCLR=AA;
I2CONCLR=SI; //启动接收最后数据
do{}while(I2STAT!=0X58);
}
else
{
I2CONSET=AA;
I2CONCLR=SI; //启动接收数据
do{}while(I2STAT!=0X50);
}
return I2DAT;
}
/***************写4个字节到24c02*****************************/
void WriteC02()
{
uint8 i;
I2C_Start();
WriteAddr(WRMode); //写地址和写模式
WriteData(C02SlaveAddr); //24c02的存储地址
for(i=0;i<4;i++) I2C_buf1=i+5; //I2C_buf初始化
for(i=0;i<4;i++)
{
WriteData(I2C_buf1);
}
I2C_Stop();
DelayMs(10); // 延时等待eeprom写操作
//把写到I2C上的数据在串口上打印出来
DelayMs(100);
UART0_PutString(" \nWrite to I2C BUS:\n");
DelayMs(1000);
for(i=0;i<4;i++)
{
UART0_PutChar(I2C_buf1+48);
UART0_PutString("\n");
DelayMs(1000);
}
}
/******************从24c02地址读4个字节数据************/
void ReadC02()
{
uint8 i;
I2C_Start();
WriteAddr(WRMode);
WriteData(C02SlaveAddr);
I2C_Stop();
I2C_Start();
WriteAddr(RDMode);
for(i=0;i<4;i++) I2C_buf2=0;
for(i=0;i<3;i++)
{
I2C_buf2=ReadByte(!lastbyte);
}
I2C_buf2[3]=ReadByte(lastbyte);
I2C_Stop();
//把从I2C上读到的数据在串口上打印出来
UART0_PutString(" \nRead form I2C BUS:\n");
DelayMs(1000);
for(i=0;i<4;i++)
{
UART0_PutChar(I2C_buf2+48);
UART0_PutString("\n");
DelayMs(1000);
}
}
/************************beep鸣叫********************/
void Beep()
{
while(1)
{//IO0CLR=BEEP;
// DelayMs(100);
IO0CLR = LED1|LED2;
// DelayMs(10000);
}
}
/************************led闪烁******************/
void LedFlash()
{
while(1)
{
IO0CLR |= LED1|LED2;
DelayMs(500);
IO0SET |= LED1|LED2;
DelayMs(500);
}
}
/*************************主函数*********************/
void main()
{
//PINSEL0 = 0x00000055; // 设置I/O口工作模式,使用I2C0口,P0.2,P0.3和UART0的P0.0,P0.1。其余口为GPIO口
//PINSEL1 = 0x00000000;
PINSEL0 = (PINSEL0&0XFFF0FFFF)|(0X05); //设置UART0的P0.0,P0.1的功能为TXD0,RXD0
PINSEL1 = (PINSEL1&0XFFFFFFC3)|(0X05<<2); //设置I2C1的P0.17,P0.18的功能为SDL1.SCL1
IO0DIR=LED1|LED2; //设置GPIO的方向
IO0SET=LED1|LED2; //使接口输出高电平
PLL_Init(); //锁相环初始化
I2C_Init(); //I2C初始化
UART0_Init(); //串口初始化
for(i=5;i<9;i++)
{
WriteC02(); //往24C02写4个字节数据
DelayMs(1000); //延时
ReadC02(); //从24C02把写进去的数读出来
DelayMs(1000); //延时
}
/*********判断是否相等,并显示***************/
for(i=0;i<4;i++)
{
if(I2C_buf2!=I2C_buf1) //如果有不相等的出现
Beep();
}
LedFlash();
}
|