#include <string.h>
#include "2440addr.h"
#include "2440lib.h"
#include "Option.h"
#include "def.h"
int flag; //中断标志(在中断子程序里清零,即未中断flag=1,中断后flag=0)
void __irq IicInt(void);
void Wr24C02(U32 slvAddr,U32 addr,U8 data);
void Rd24C02(U32 slvAddr,U32 addr,U8 *data);
void Main(void)
{
unsigned int i,j;
static U8 data[256]; //用于存储AT24C02读出的数据
SelectFclk(2); //设置系统时钟 400M
ChangeClockDivider(2, 1); //设置分频 1:4:8
CalcBusClk(); //计算总线频率
rGPHCON &=~((3<<4)|(3<<6));
rGPHCON |=(2<<4)|(2<<6); //GPH2--TXD[0];GPH3--RXD[0]
rGPHUP=0x00; //使能上拉功能
Uart_Init(0,115200);
Uart_Select(0);
Uart_Printf("[ IIC Test(Polling) using AT24C020 ]\n");
rGPEUP |= 0xc000; //关上拉
rGPECON &= ~0xf0000000;
rGPECON |= 0xa0000000; //GPE15:IICSDA , GPE14:IICSCL
pISR_IIC=(unsigned)IicInt; //设置中断程序地址
rINTMSK &=~(BIT_IIC); //开中断源
//使能应答, IIC总线时钟IICCLK=PCLK/16, 使能中断, 发送时钟IICCLK/16
rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
rIICADD = 0x10; //2440 从机地址 = [7:1]
rIICSTAT = 0x10; //IIC总线数据输出使能(Rx/Tx)
Uart_Printf("Write test data into AT24C02\n");
for(i=0;i<256;i++)
Wr24C02(0xa0,(U8)i,i);//写入数据到AT24C02
for(i=0;i<256;i++) //数组数据清零
data[i] = 0;
Uart_Printf("Read test data from AT24C02\n");
for(i=0;i<256;i++)
Rd24C02(0xa0,(U8)i,&(data[i]));//读取AT24C02的数据放入data数组中
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
Uart_Printf("%2x ",data[i*16+j]); //打印从AT24C02读出的数据
Uart_Printf("\n");
}
}
void Wr24C02(U32 slvAddr, U32 addr, U8 data)
{
flag=1;
rIICDS = slvAddr; //从器件地址写入数据移位寄存器
rIICSTAT=0xf0; //主发模式,产生起始信号,使能Rx/Tx
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
flag=1;
rIICDS = addr; //写入存储字节的地址到数据移位寄存器
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
flag=1;
rIICDS = data; //把要发送的数据写入数据移位寄存器
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
rIICSTAT = 0xd0; //禁止Rx/Tx
rIICCON = 0xaf; //Resumes IIC operation.
Delay(1);
}
void Rd24C02(U32 slvAddr, U32 addr, U8 *data)
{
U8 temp;
flag=1;
rIICDS = slvAddr; //从器件地址写入数据移位寄存器
rIICSTAT=0xf0; //主发模式,产生起始信号,使能Rx/Tx
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
flag=1;
rIICDS = addr; //写入存储字节的地址到数据移位寄存器
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
flag=1;
rIICDS = slvAddr;
rIICSTAT=0xb0; //主接收模式,使能Rx/Tx
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1) //等待发送完成
Delay(1);
//注意:读取下面这个字节必须进行,因为在发送带有读命令的从设备地址后,
//AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以
//一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;
flag=1;
temp=rIICDS;
rIICCON &=~0x10; //清除Tx/Rx中断挂起标志
while(flag==1)
Delay(1);
rIICCON=0x2f; //Resumes IIC operation.禁止应答
*data=rIICDS;
Delay(1);
rIICSTAT = 0x90; //Stop MasRx condition
rIICCON = 0xaf; //Resumes IIC operation.
Delay(1); //Wait until stop condtion is in effect.
}
void __irq IicInt(void)
{
ClearPending(BIT_IIC);
flag=0;
}