/****************************Copyright (c)*************************************
**
** CHINA ARM
**
** 中国 ARM 开源工作室
** Renesas 单片机工作组
**
** 开源平台:http://www.ouravr.com/bbs
** 版权属于: http://www.china-arm.com
**
**--------------文件信息-------------------------------------------------------
**文 件 名: IIC.C
**创 建 人: 吕海安
**最后修改日期: 2007年11月17日
**描 述: IIC Bus file,IIC的底层驱动函数
**
**--------------历史版本信息---------------------------------------------------
** 创建人: 吕海安
** 版 本: v1.0 (Evaluation Edition )
** 日 期: 2007.11.17
** 描 述: 原始版本
**
**--------------当前版本修订---------------------------------------------------
** 修改人: 吕海安
** 版 本: v1.1 (Evaluation Edition )
** 日 期: 2007.11.20
** 描 述: 根据 EEPROM 的底层函数修改 IIC 库函数
**
**-----------------------------------------------------------------------------
*******************************************************************************/
#include "..\inc\Comdef_r823.h"
#include "Target\config.H"
#include "IIC.h"
#define DelayNop() asm("nop")
#define InIicSDA p3_4
#define DDR_IicSDA_OUT(); {pd3_4 = 1;}
#define DDR_IicSDA_IN(); {pd3_4 = 0;}
#define DDR_IicSCL_OUT(); {pd3_5 = 1;}
#define DDR_IicSCL_IN(); {pd3_5 = 0;}
#define SetIicSDA(); {p3_4 = 1;}
#define ClrIicSDA(); {p3_4 = 0;}
#define SetIicSCL(); {p3_5 = 1;}
#define ClrIicSCL(); {p3_5 = 0;}
void _WaitTime0us(void);
void _WaitTime1us(void);
void _WaitTime2us(void);
#define _Wait_tHIGH _WaitTime1us() // Clock pulse width high
#define _Wait_tLOW _WaitTime2us() // Clock pulse width low
#define _Wait_tHD_STA _WaitTime1us() // Start hold time
#define _Wait_tSU_STA _WaitTime1us() // Start setup time
#define _Wait_tHD_DAT _WaitTime0us() // Data in hold time
#define _Wait_tSU_DAT _WaitTime1us() // Data in setup time
#define _Wait_tAA _WaitTime1us() // Access time
#define _Wait_tSU_STO _WaitTime1us() // Stop setup time
#define _Wait_tBUF _WaitTime2us() // Bus free time for next mode
/******************************************************************************
** 函数名称: InitIicBus
** 功能描述: initialize I2C-BUS port
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年11月27日
**-----------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-----------------------------------------------------------------------------
*******************************************************************************/
void InitIicBus(void)
{
DDR_IicSDA_IN(); // SDA input ("H" state)
DDR_IicSCL_IN(); // SCL input ("H" state)
}
/******************************************************************************
** 函数名称: IicBusRead
** 功能描述: Sequential Ramdom Read Cycle (I2C-BUS)
** 输 入: IicPack *IicData: structure IicPack pointer
** 输 出: INT8U ret: Acknowledge
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年11月27日
**-----------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-----------------------------------------------------------------------------
*******************************************************************************/
INT8U IicBusRead(IicPack *IicData)
{
INT8U i,ret;
// Ramdom Read Cycle / Sequential Ramdom Read Cycle
IicData->iic_DeviceAddress &= 0xFE; // WRITE Setting Device Address
StartCondition(); // Start Condition
while(1)
{
if ((ret = ByteWrite(IicData->iic_DeviceAddress)) == NOACK) // WRITE Device Address
{
break; // NoAck Detect
}
if ((ret = ByteWrite(IicData->iic_MemoryAddress)) == NOACK) // WRITE Memory Address
{
break; // NoAck Detect
}
IicData->iic_DeviceAddress |= 0x01; // READ Setting Device Address
StartCondition(); // ReStart Condition
if ((ret = ByteWrite(IicData->iic_DeviceAddress)) == NOACK) // WRITE Device Address
{
break; // NoAck Detect
}
for (i = 1; i < IicData->iic_NumberOfByte; i++) // specified bytes as loop
{
ByteRead(IicData->iic_Data, ACK); // Read data (Ack output)
IicData->iic_Data++;
}
ByteRead(IicData->iic_Data, NOACK); // Read data (NoAck output)
break;
}
StopCondition(); // Stop Condition
return(ret);
}
/******************************************************************************
** 函数名称: IicBusWrite
** 功能描述: Byte Write or Page Write Cycle (I2C-BUS)
** 输 入: IicPack *IicData: structure IicPack pointer
** 输 出: INT8U ret: Acknowledge
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年11月27日
**-----------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-----------------------------------------------------------------------------
*******************************************************************************/
INT8U IicBusWrite(IicPack *IicData)
{
INT16U i;
INT8U ret;
INT16U EndAddr; // 结束地址
INT8U Page; // 页写标志
ret = NOACK;
EndAddr = IicData->iic_MemoryAddress + IicData->iic_NumberOfByte;
if (EndAddr > 0x3ff) return(ret); // 结束地址超出容量
// Byte Write / Page Write
IicData->iic_DeviceAddress &= 0xFE; // WRITE Setting Device Address
// 16 字节/页, 按页写
while (IicData->iic_MemoryAddress < EndAddr)
{
StartCondition();
if ((ret = ByteWrite(IicData->iic_DeviceAddress)) == NOACK) // Write Device Address
{
break; // NoAck Detect
}
if ((ret = ByteWrite(IicData->iic_MemoryAddress)) == NOACK) // Write Memory Addreess
{
break; // NoAck Detect
}
Page = 0xff;
while ((IicData->iic_MemoryAddress < EndAddr) && Page)
{
//IicData->iic_Data;
ByteWrite(*IicData->iic_Data);
IicData->iic_MemoryAddress++;
IicData->iic_Data++;
if ((IicData->iic_MemoryAddress & 0x0f) == 0) Page = 0; // 一个页写结束
}
StopCondition();
for (i = 0; i < 40000; i++);
}
return(ret);
}
/******************************************************************************
** 函数名称: StartCondition
** 功能描述: Output Start Condition (I2C-BUS)
** *1 adjust a wait time
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年11月27日
**-----------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-----------------------------------------------------------------------------
*******************************************************************************/
void StartCondition(void)
{
ClrIicSCL(); // SCL = "L"
DDR_IicSCL_OUT(); // SCL output
_WaitTime1us(); // wait *1
DDR_IicSDA_IN(); // SDA = "H"
_WaitTime1us(); // wait *1
_WaitTime1us(); // wait *1
SetIicSCL(); // SCL = "H"
_Wait_tSU_STA; // wait
ClrIicSDA(); // SDA = "L"
DDR_IicSDA_OUT(); // SDA output
_Wait_tHD_STA; // wait
_WaitTime1us(); // wait *1
ClrIicSCL(); // SCL = "L"
}
/******************************************************************************
** 函数名称: StopCondition
** 功能描述: Output Stop Condition (I2C-BUS).
** *1 adjust a wait time
** 输