分类:
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");
}