S3C2440A IIC驱动(AT24c04)

来源:互联网 发布:java反射机制原理 编辑:程序博客网 时间:2024/06/01 17:23

int f_nGetACK;
/*********************************************************************************
* name:  iic_test
* func:  test iic
* para:  none
* ret:  none
* modify:
* comment:  
*********************************************************************************/
void iic_test(void)
{
    char szData[16] = "liuzhiping";
    unsigned int  i;
    
    Uart_Printf("\n IIC Protocol Test Example, using AT24C04...\n");
    Uart_Printf(" Write char 0-f into AT24C04\n");
   
    f_nGetACK = 0;
   
    // Enable interrupt
    rINTMOD  = 0x0;
    ClearPending(BIT_IIC);
    rINTMSK &= ~BIT_IIC;
    pISR_IIC = (unsigned)iic_int_24c04;
   
    // Initialize iic
    rIICADD = 0x10;            // S3C2410X slave address
    rIICCON = 0xaf;            // Enable ACK, interrupt, SET IICCLK=MCLK/16
    rIICSTAT = 0x10;           // Enable TX/RX

    // Write 0 - 16 to 24C04
    for(i=0; i<16; i++)
    {
        iic_write_24c040(0xa0, i, szData[i]);
        Uart_Printf(" %d", szData[i]);
        Delay(10);
    }

    // Clear array
    for(i=0; i<16; i++)
        szData[i]=0;

    // Read 16 byte from 24C04
    for(i=0; i<16; i++)
        iic_read_24c040(0xa0, i, &(szData[i]));
   
    // Printf read data
    Uart_Printf(" \nRead 16 bytes from AT24C04\n");
    for(i=0; i<16; i++)
    {
        Uart_Printf(" %c ", szData[i]);
    }

    rINTMSK |= BIT_IIC;
    Uart_Printf("\n end.\n");
}
/*********************************************************************************
* name:  iic_write_24c040
* func:  write data to 24C040
* para:  unSlaveAddr --- input, chip slave address
*   unAddr  --- input, data address
*   ucData     --- input, data value
* ret:  none
* modify:
* comment: 
*********************************************************************************/
void iic_write_24c040(unsigned int unSlaveAddr, unsigned int unAddr, char ucData)
{
    f_nGetACK = 0;

    // Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xf0;           // Master Tx,Start
    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;

    //Send address
    rIICDS = unAddr;
    rIICCON = 0xaf;            // Resumes IIC operation.

    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;

    // Send data
    rIICDS = ucData;
    rIICCON = 0xaf;            // Resumes IIC operation.

    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;

    // End send
    rIICSTAT = 0xd0;           // Stop Master Tx condition
    rIICCON = 0xaf;            // Resumes IIC operation.
    Delay(5);             // Wait until stop condtion is in effect.
}
 
/********************************************************************************
* name:  iic_read_24c040
* func:  read data from 24C040
* para:  unSlaveAddr --- input, chip slave address
*   unAddr  --- input, data address
*   pData     --- output, data pointer
* ret:  none
* modify:
* comment: 
*********************************************************************************/
void iic_read_24c040(unsigned int unSlaveAddr, unsigned int unAddr, char *pData)
{
    char cRecvByte;

    f_nGetACK = 0;
   
    //Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xf0;           // Master Tx,Start
    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;
   
    // Send address
    rIICDS = unAddr;
    rIICCON = 0xaf;            // Resumes IIC operation.
    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;
   
    //Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xb0;           // Master Rx,Start
    rIICCON = 0xaf;            // Resumes IIC operation.  

    while(f_nGetACK == 0)          // Wait ACK
    {
        Delay(1);/*必须延时1ms*/
    }
    f_nGetACK = 0;

    //Get data
    cRecvByte = rIICDS;
    rIICCON = 0x2f;
    Delay(1);

    // Get data
    cRecvByte = rIICDS;

    // End receive
    rIICSTAT = 0x90;           // Stop Master Rx condition
    rIICCON = 0xaf;            // Resumes IIC operation.
    Delay(5);             // Wait until stop condtion is in effect.

    *pData = cRecvByte;
}
/*********************************************************************************
* name:  iic_int_24c04()
* func:  IIC interrupt handler
* para:  none
* ret:  none
* modify:
* comment: 
*********************************************************************************/
void __irq iic_int_24c04(void)
{
    ClearPending(BIT_IIC);
    f_nGetACK = 1;
}

芯片:S3C2440A
iic从设备:AT24C04

这份代码基本是从网上拷贝的,在此谢谢网上的大牛们,小弟向你们致敬,忘了原创大牛是谁,就没写转载地址,请大牛谅解哦。

心得:开始这份代码怎么也不能用,后来在每个while(f_nGetACK == 0)循环中添加了个延时,就可以用了,但还不知道原理,先用着吧!希望给后来的兄弟有帮助。
阅读(488) | 评论(0) | 转发(0) |
0

上一篇:windows ssh登录debian

下一篇:程序的自我改写

相关热门文章
  • shell中字符串操作
  • shell中的特殊字符
  • linux守护进程的几个关键地方...
  • stagefright与opencore对比
  • 嵌入式Linux之我行——u-boot-...
  • 修改默认端口为222,centos自...
  • 用PHP做一个ftp登录页面...
  • Toad for Oracle工具,为什么在...
  • 本地win7安装vmw9系统winserv...
  • powermt config是所什么用的...
给主人留下些什么吧!~~
原创粉丝点击