有两个文件,前面这个是c文件,后面那个是他的头文件。沁恒公司恒
// *******************************************************************
// 作者: sanniu
// 时间:2009年2月2日
// 版本:V 1.0
// *******************************************************************
#include "CH423IF.H" // 修改该文件以适应硬件环境/单片机型号等
void CH423_I2c_Start( void ) // 操作起始
{
CH423_SDA_SET; // 发送起始条件的数据信号
CH423_SDA_D_OUT; // 设置SDA为输出方向
CH423_SCL_SET;
CH423_SCL_D_OUT; // 设置SCL为输出方向
DELAY_0_1US;
CH423_SDA_CLR; //发送起始信号
DELAY_0_1US;
CH423_SCL_CLR; //钳住I2C总线,准备发送或接收数据
}
void CH423_I2c_Stop( void ) // 操作结束
{
CH423_SDA_CLR;
DELAY_0_1US;
CH423_SCL_SET;
DELAY_0_1US;
CH423_SDA_SET; // 发送I2C总线结束信号
DELAY_0_1US;
}
void CH423_I2c_WrByte( uint8 dat ) // 写一个字节数据
{
uint8 i;
for( i = 0; i != 8; i++ ) // 输出8位数据
{
if( dat&0x80 ) { CH423_SDA_SET; }
else { CH423_SDA_CLR; }
DELAY_0_1US;
CH423_SCL_SET;
dat<<=1;
DELAY_0_1US; // 可选延时
CH423_SCL_CLR;
}
CH423_SDA_SET;
DELAY_0_1US;
CH423_SCL_SET; // 接收应答
DELAY_0_1US;
CH423_SCL_CLR;
}
uint8 CH423_I2c_RdByte( void ) // 读一个字节数据
{
uint8 dat,i;
CH423_SDA_SET;
CH423_SDA_D_IN; // 设置SDA为输入方向
dat="0";
for( i = 0; i != 8; i++ ) // 输入8位数据
{
DELAY_0_1US; // 可选延时
CH423_SCL_SET;
DELAY_0_1US; // 可选延时
dat<<=1;
if(CH423_SDA_IN) dat++; // 输入1位
CH423_SCL_CLR;
}
CH423_SDA_SET;
DELAY_0_1US;
CH423_SCL_SET; // 发出无效应答
DELAY_0_1US;
CH423_SCL_CLR;
return(dat);
}
void CH423_WriteByte( uint16 cmd ) // 写出数据
{
CH423_I2c_Start(); // 启动总线
CH423_I2c_WrByte( ( uint8 )( cmd>>8 ) );
CH423_I2c_WrByte( ( uint8 ) cmd ); // 发送数据
CH423_I2c_Stop(); // 结束总线
}
uint8 CH423_ReadByte(void) // 读取数据
{
uint8 din;
CH423_I2c_Start(); // 启动总线
CH423_I2c_WrByte( CH423_RD_IO_CMD ); // 此值为0x4D
din="CH423"_I2c_RdByte(); // 读取数据
CH423_I2c_Stop(); // 结束总线
return( din );
}
void CH423_Write(uint16 data)
{
CH423_WriteByte(CH423_OC_H_CMD | (data>>8));
CH423_WriteByte(CH423_OC_L_CMD | (uint8)(data));
}
void CH423_Write8(uint8 data)
{
CH423_WriteByte(CH423_SET_IO_CMD | (data));
}
uint8 CH423_Read8(void)
{
uint8 ret;
// CH423_WriteByte(CH423_SYS_CMD);
CH423_I2c_Start(); // 启动总
CH423_I2c_WrByte(0x4d);
ret = CH423_I2c_RdByte();
CH423_I2c_Stop(); // 结束总线
// CH423_WriteByte(CH423_SYS_CMD | 0x0001);
return ret;
}
void CH423_Init(void)
{
CH423_PINSEL();
CH423_WriteByte(CH423_SYS_CMD | 0x0001);
}
// *******************************************************************
// 作者: sanniu
// 时间:2009年2月2日
// 版本:V 1.0
// *******************************************************************
// 硬件相关定义, 请根据实际硬件修改本文件
#ifndef CH423IF_H
#define CH423IF_H
#include "config.h"
/* 延时0.1uS子程序,与单片机速度有关,对于双向I/O可以不需要延时,对于带上拉的准双向I/O建议加上延时 */
#define DELAY_0_1US { uint32 i; uint8 t="1"; for(;t>0;t--)for(i=1;i>0;i--); }
/* 2线接口的连接,与实际电路有关 */
#define CH423_SCL 1<<28
#define CH423_SDA 1<<27
/* 2线接口的位操作,与单片机有关 */
#define CH423_PINSEL() PINSEL0 &= ~(0xFF<<22)
#define CH423_SCL_SET { FIO0SET = CH423_SCL; }
#define CH423_SCL_CLR { FIO0CLR = CH423_SCL; }
#define CH423_SCL_D_OUT { FIO0DIR |= CH423_SCL; } // 设置SCL为输出方向,对于双向I/O需切换为输出
#define CH423_SDA_SET { FIO0SET = CH423_SDA;}
#define CH423_SDA_CLR { FIO0CLR = CH423_SDA;}
#define CH423_SDA_IN ( (uint8)((FIO0PIN >> 3)&0x01))
#define CH423_SDA_D_OUT { FIO0DIR |= CH423_SDA;} // 设置SDA为输出方向,对于双向I/O需切换为输出
#define CH423_SDA_D_IN { FIO0DIR &= ~CH423_SDA;} // 设置SDA为输入方向,对于双向I/O需切换为输入
/* 设置系统参数命令 */
#define CH423_SYS_CMD 0x4800 // 设置系统参数命令,默认方式
/* 设置低8位开漏输出命令 */
#define CH423_OC_L_CMD 0x4400 // 设置低8位开漏输出命令,默认方式
/* 设置高8位开漏输出命令 */
#define CH423_OC_H_CMD 0x4600 // 设置低8位开漏输出命令,默认方式
/* 设置双向输入输出命令 */
#define CH423_SET_IO_CMD 0x6000 // 设置双向输入输出命令,默认方式
/* 读取双向输入输出命令 */
#define CH423_RD_IO_CMD 0x4D // 输入I/O引脚当前状态
extern void CH423_Init(void);
extern void CH423_Write(uint16 data); // 写出数据
//extern void CH423_WriteByte( uint16 cmd ); //写命令
void CH423_Write8(uint8 data);
uint8 CH423_Read8(void);
uint8 CH423_ReadByte(void);
#endif
文章评论(0条评论)
登录后参与讨论