Chinaunix首页 | 论坛 | 博客
  • 博客访问: 363834
  • 博文数量: 53
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1143
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-14 11:53
文章分类

全部博文(53)

文章存档

2011年(1)

2008年(52)

我的朋友

分类:

2008-08-27 20:37:39

/******************************************************************************
  文 件 名   : fooDrv.c
  版 本 号   : 初稿
  作    者   : huangxb
  生成日期   : 2008年8月22日
  功能描述   : 2410的iic驱动,采用轮询方式
 
  修改历史   :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 创建文件
*****************************************************************************/
   
/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/
#include "stdio.h"
#include "string.h"
/*----------------------------------------------*
 * 外部变量说明                                 *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 外部函数原型说明                             *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 内部函数原型说明                             *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 全局变量                                     *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 模块级变量                                   *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 常量定义                                     *
 *----------------------------------------------*/

/*****************************************************************************
 函 数 名  : iicInit
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月23日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
void iicInit()
{
    rGPGCON &= 0x0fffffff;                 
    rGPECON = (2<<28)|(2<<30);     /* 选择端口GPE14、15为IICSCL、IICSDA */  
   
    rGPEUP &= 0x3fff;                    
    rGPEUP |= (1<<15)|(1<<14);      /* GPE14、15禁止内部上拉 */
   
 rIICADD = 0x10;     /* S3C2410X slave address */
    rIICCON = 0x8f;     // Enable ACK, interrupt disable, SET Tx clock=IICCLK/16
    rIICSTAT = 0x10;    // Enable TX/RX
}
/*****************************************************************************
 函 数 名  : iicWrite
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月23日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
int iicWrite(unsigned int unSlaveAddr, unsigned int unAddr, unsigned char ucData)
{
    // Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xf0;           // Master Tx,Start

    while(!(IICSTAT&0x1));          // Wait ACK
   
    //Send address
    rIICDS = unAddr;
    rIICCON = 0x8f;            // Resumes IIC operation.
   
    while(!(IICSTAT&0x1));          // Wait ACK
 
    // Send data
    rIICDS = ucData;
    rIICCON = 0x8f;            // Resumes IIC operation.
   
    while(!(IICSTAT&0x1));          // Wait ACK
   
    // End send
    rIICSTAT = 0xd0;           // Stop Master Tx condition
    rIICCON = 0x8f;            // Resumes IIC operation.
    delay(5);
}

/*****************************************************************************
 函 数 名  : iicRead
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月23日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
int iicRead(unsigned int unSlaveAddr, unsigned int unAddr, unsigned char *pData)
{
 unsigned char cRecvByte;

    //Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xf0;           // Master Tx,Start

    while(f_nGetACK == 0);          // Wait ACK
    f_nGetACK = 0;

    // Send address
    rIICDS = unAddr;
    rIICCON = 0x8f;            // Resumes IIC operation.
   
    while(f_nGetACK == 0);          // Wait ACK
    f_nGetACK = 0;

    //Send control byte
    rIICDS = unSlaveAddr;          // 0xa0
    rIICSTAT = 0xb0;           // Master Rx,Start
 rIICCON = 0x8f;            // Resumes IIC operation.  
 
    while(f_nGetACK == 0);          // Wait ACK
    f_nGetACK = 0;
   
    rIICCON = 0x0f;                                             //Master Rx
    delay(1);
   
    // Get data
    cRecvByte = rIICDS;
   
    // End receive
    rIICSTAT = 0x90;           // Stop Master Rx condition
 rIICCON = 0x8f;            // Resumes IIC operation.
 delay(5);             // Wait until stop condtion is in effect.
 
    *pData = cRecvByte;   
}

/*****************************************************************************
 函 数 名  : iicTest
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月23日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
void iicTest()
{
    unsigned char szData[16];
    unsigned int i;
   
    uart_printf("iicTest begin.\n\n ");
   
    for(i=0; i<16; i++)
    {
  iic_write_24c040(0xa0, i, i);
  uart_printf("write data %d\n",i);
  delay(10);
 }
 
 // Clear array
    memset(szData, 0, 16);
   
    // Read 16 byte from 24C04
    for(i=0; i<16; i++)
  iic_read_24c040(0xa0, i, &(szData[i]));

    for(i=0; i<16; i++)
        uart_printf("read data %2x\n", szData[i]);

 uart_printf("\niicTest end.\n");
}

阅读(2068) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2009-04-26 16:24:26

这个程序是有好多错误的!!