s3c2440A操作24C08

来源:互联网 发布:数据挖掘与r语言 源码 编辑:程序博客网 时间:2024/05/28 09:32

我这里实现的是非中断模式下的IIC操作

数据手册和代码对照着很容易看懂,尤其是数据手册上IIC那一章的几张程序流程图,一目了然。

下面是代码:

//这里没有用精确延时void delay1(){int i = 0;int j = 0;for(i = 0; i < 100; i++){for(j = 0; j < 100; j++);}}/*************************************************************Function name: IIC_InitDescription:Initialize IIC registersParameters:NoneReturns:None**************************************************************/void IIC_Init(){//GPE14:IICSCL  GPE15:IICSDArGPECON = rGPECON & (~(0xf << 28)) | (0xa << 28);//GPE14 GPE15 poll up function disabledrGPEUP = 0xc000;//rIICCON[7] = 1: enable IIC_bus acknowledge bit//rIICCON[6] = 0: IICCLK = fPCLK / 16//rIICCON[5] = 1: Tx/Rx interrupt enable//rIICCON[3..0]: Tx clock = IICCLK/(IICCON[3:0]+1)rIICCON = (1 << 7) | (0 << 6) | (1 << 5) | 0x0f;//rIICSTAT[4] = 1: enable Rx/TxrIICSTAT = (1 << 4);rIICADD = 0x10;}/*************************************************************Function name: Write24C08_nbyteDescription:Write data to 24C08Parameters:slave_addr: the address of IIC device, often set to "0xa0"IIC_addr: exact data addressIIC_data:value of dataReturns:None**************************************************************/void Write24C08_nbyte(unsigned int slave_addr, unsigned int IIC_addr, unsigned char IIC_data){ unsigned int i = 0;unsigned int j = 0;rIICDS = slave_addr;  //从设备地址//rIICSTAT[7:6]:11--master Tx mode//rIICSTAT[5]: 1--start signal//rIICSTAT[4]: 1--enable Rx/TxrIICSTAT = 0xf0;  //开始写while(!(rIICCON & 0x10));  //等待应答信号,该位为1,收到应答rIICDS = IIC_addr; //向移位寄存器送数据:数据地址for(i = 0; i < 10; i++);rIICCON = 0xaf;while(!(rIICCON & 0x10));rIICDS = IIC_data;  //向移位寄存器送数据rIICCON = 0xaf;   //rIICCON[4] = 0:清空挂起位while(!(rIICCON & 0x10));Uart_Printf("Send %d data %d to IIC\n", IIC_addr, IIC_data);rIICSTAT = 0xd0; //rIICSTAT[5] = 0:STOP signal generation when write,停止信号rIICCON = 0xaf; //清空挂起位for(i = 0; i < 10; i++);}/*************************************************************Function name:Read24C08_nbyteDescription:Read data from 24C08Parameters:slave_addr: the address of IIC device, often set to "0xa0"IIC_addr: exact data addressdatabuffer:used to storage data valueReturns:None**************************************************************/void Read24C08_nbyte(U32 slave_addr,U32 IIC_addr,U8 *databuffer){        unsigned int i = 0;unsigned int j = 0;unsigned int add_in = IIC_addr;        U32 temp = 0;U32 tt = 0;        rIICDS   = slave_addr;//0xa0        rIICSTAT = 0xf0;   //开启IIC写功能,写IIC地址while(!(rIICCON & 0x10));        rIICDS   = (U8)add_in;  //数据具体地址        for(i=0;i<10;i++);        rIICCON  = 0xaf; //清空挂起标志位resumes IIC operation.        while(!(rIICCON & 0x10));rIICDS   = slave_addr;        rIICSTAT = 0xb0;      //bit[7:6]:10--master Rx mode,master receive mode        rIICCON  = 0xaf;        while(!(rIICCON & 0x10));        temp = rIICDS;      rIICCON  = 0x2f; for(i=0;i<10;i++);while(!(rIICCON & 0x10));    tt = rIICDS;Uart_Printf("databuffer = 0x%x, %d  IIC_addr = %d, temp = %d\n", tt, tt, IIC_addr, temp);          rIICSTAT = 0x90;      //停止读        rIICCON  = 0xaf;        delay1();}


原创粉丝点击