原创 两线远程 I/O 扩展芯片 CH423 驱动应用

2009-4-13 14:49 8083 19 19 分类: MCU/ 嵌入式
 用CH423扩展IO口,对IO口要求比较多的场合很实用,而且它是IIC两线接口的,操作起来也很方便,现在已经移值到LPC2000系列上,希望对用这块芯片的朋友有帮助,沁恒公司提供源代码的,移值起来也不是很难,有什么问题也可以去找他们的技术支持。下面是我移值到LPC2000系列的驱动代码。

    有两个文件,前面这个是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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
19
关闭 站长推荐上一条 /3 下一条