- #include
- #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;
- }
上一篇:s3c2410与s3c2440的部分细节区别整理
下一篇:S3C2440 IIC总线接口
推荐阅读最新更新时间:2024-03-16 14:50