Chinaunix首页 | 论坛 | 博客
  • 博客访问: 561229
  • 博文数量: 105
  • 博客积分: 3274
  • 博客等级: 中校
  • 技术积分: 1161
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 12:14
文章分类

全部博文(105)

文章存档

2011年(1)

2010年(104)

分类: 嵌入式

2010-05-08 11:44:01

最近有个客户要求在产品上使用U盘,由于公司以前有用ch374做过类似的产品,于是决定使用ch374。
原公司提供的库函数已经完全满足了,但是还是记录下来。
简单驱动如下
/******************************************************************
** Copyright (c)
** 文件名: ch374_hw.c        CPU Type: lpc2119 
** 创建人:
** 描  述: 用于提供ch374的硬件抽象层,以与ch374芯片提供公司的库相对应
** 修改人:
** 描  述:
            若换成其他lpc芯片,修改下列几个地方即可
            4个宏:CH374_A0 CH374_CS CH374_WR CH374_RD
            4个函数:
                    void CH374_DATA_DIR_OUT(void);
                    void CH374_DATA_DIR_IN(void);
                    void CH374_DATA_DAT_OUT( UINT8 mIndex );
                    UINT8 CH374_DATA_DAT_IN(void);
*******************************************************************/
 
/* 如果准备使用双缓冲区交替读写,那么可以在参数中指定缓冲区起址 */
/* 有些ARM单片机提供开放系统总线,那么直接将CH374挂在其系统总线上,以8位I/O方式进行读写 */
/* 本例使用的LPC2119不开放系统总线,所以用I/O引脚模拟产生CH374的并口读写时序 */
/* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */
  /* LPC2119单片机的引脚    CH374芯片的引脚
         P0.7                 INT#
         P1.22                A0
         P1.19                CS#
         P1.20                WR#
         P1.21                RD#
  P0.23-P0.16(8位端口)         D7-D0       */ 
#define   CH374_A0   (1<<22)  // p1.22
#define  CH374_CS   (1<<19)  // p1.19
#define  CH374_WR      (1<<20)  // p1.20
#define  CH374_RD      (1<<21)  // p1.21 
//#define CH374_INT_WIRE   ( IO0PIN & 0x80 ) /* P0.7, CH374的中断线INT#引脚,连接CH374的INT#引脚,用于查询中断状态 */
// 如果未连接CH374的中断引脚,那么应该去掉上述定义,自动使用寄存器查询方式
#include "global.h"
#include "CH374HF9.H"

// 设置并口方向为输出
void CH374_DATA_DIR_OUT(void)
{
    IO0DIR |= 0x00ff0000;  
}
// 设置并口方向为输入
void CH374_DATA_DIR_IN(void)
{
    IO0DIR &= 0xff00ffff;  
}
// 向并口输出数据
void CH374_DATA_DAT_OUT( UINT8 mIndex )
{
    IO0PIN = (IO0PIN & 0xff00ffff) | (mIndex << 16); 
}
// 从并口输入数据
UINT8 CH374_DATA_DAT_IN(void)
{
    return ((UINT8)(IO0PIN >> 16));
}
/********************************************************************
函数功能:ch374相关的IO初始化
入口参数:无
返    回:无。
备    注:系统初始化时调用
********************************************************************/
void CH374_PORT_INIT(void) 
{
    IO1DIR |= CH374_A0 | CH374_CS | CH374_WR | CH374_RD;  // 设置为输出
    IO1SET = CH374_CS | CH374_WR | CH374_RD;
    IO1CLR = CH374_A0;
 CH374_DATA_DIR_IN( );  // 设置并口输入
}

void Write374Index( UINT8 mIndex ) 
{
    CH374_DATA_DIR_OUT();  // 设置并口方向为输出
    IO1CLR = CH374_CS;
    IO1SET = CH374_A0;  
 IO1CLR = CH374_WR;
 
 CH374_DATA_DAT_OUT(mIndex);  // 向CH374的并口输出数据
    IO1SET = CH374_WR;
 IO1CLR = CH374_A0;
 IO1SET = CH374_CS; 
 CH374_DATA_DIR_IN();  // 禁止数据输出
}
void Write374Data( UINT8 mData )  // 向CH374写数据,索引地址自动加1
{
    CH374_DATA_DIR_OUT();  // 设置并口方向为输出 /
    IO1CLR = CH374_CS;
    IO1CLR = CH374_A0;
   
 CH374_DATA_DAT_OUT(mData);  // 向CH374的并口输出数据
    IO1CLR = CH374_WR;
 IO1SET = CH374_WR;
 
 IO1SET = CH374_CS;
 CH374_DATA_DIR_IN();  // 禁止数据输出/
}

UINT8 Read374Data( void )  // 从CH374读数据,索引地址自动加1 /
{
 UINT8 mData;
 IO1CLR = CH374_A0 | CH374_CS | CH374_RD;
 CH374_DATA_DIR_IN( );  // 设置并口方向为输入
 IO1CLR = CH374_A0 | CH374_CS | CH374_RD; // 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于70nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据
 
 mData = CH374_DATA_DAT_IN( );  // 从CH374的并口输入数据
 IO1SET = CH374_RD;
 IO1SET = CH374_CS;
 return( mData );
}
UINT8 Read374Data0( void )  // 从索引端口读出数据,索引地址不变,适用于[读出->修改->写回]操作
{
 UINT8 mData;
 IO1CLR = CH374_CS | CH374_RD;
 IO1SET = CH374_A0;
 CH374_DATA_DIR_IN( );  // 设置并口方向为输入
 IO1CLR = CH374_CS | CH374_RD; // 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于70nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据
 
 mData = CH374_DATA_DAT_IN( );  // 从CH374的并口输入数据
 IO1SET = CH374_RD;
 IO1CLR = CH374_A0;
 IO1SET = CH374_CS;
 return( mData );
}
/******************************************************************
以下为与ch374芯片提供公司的库相对应的函数
*******************************************************************/
UINT8   CH374_READ_REGISTER( UINT8 mAddr )  /* 外部定义的被CH374程序库调用的子程序,从指定寄存器读取数据 */
{
    Write374Index( mAddr );
    return( Read374Data( ) );
}
 
void    CH374_WRITE_REGISTER( UINT8 mAddr, UINT8 mData )  /* 外部定义的被CH374程序库调用的子程序,向指定寄存器写入数据 */
{
     Write374Index( mAddr );
     Write374Data( mData );
}
 
void    CH374_READ_BLOCK( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf )  /* 外部定义的被CH374程序库调用的子程序,从指定起始地址读出数据块 */
{
    Write374Index( mAddr );
    while ( mLen -- ) *mBuf++ = Read374Data( );
}
 
void    CH374_WRITE_BLOCK( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf )  /* 外部定义的被CH374程序库调用的子程序,向指定起始地址写入数据块 */
{
    Write374Index( mAddr );
    while ( mLen -- ) Write374Data( *mBuf++ );
}
 
PUINT8  CH374_READ_BLOCK64( UINT8 mAddr, PUINT8 mBuf )  /* 外部定义的被CH374程序库调用的子程序,从双缓冲区读出64字节的数据块,返回当前地址 */
{
    UINT8   i;
    Write374Index( mAddr );
    for ( i = CH374_BLOCK_SIZE / 4; i != 0; i -- )
    {  /* 减少循环次数可以略微提高速度 */
        *mBuf = Read374Data( );
        mBuf ++;
        *mBuf = Read374Data( );
        mBuf ++;
        *mBuf = Read374Data( );
        mBuf ++;
        *mBuf = Read374Data( );
        mBuf ++;
    }
   
    return( mBuf );
}
 
PUINT8  CH374_WRITE_BLOCK64( UINT8 mAddr, PUINT8 mBuf )  /* 外部定义的被CH374程序库调用的子程序,向双缓冲区写入64字节的数据块,返回当前地址 */
{
    UINT8   i;
    Write374Index( mAddr );
    for ( i = CH374_BLOCK_SIZE / 4; i != 0; i -- ) /* 减少循环次数可以略微提高速度 */
    { 
        Write374Data( *mBuf );
        mBuf ++;
        Write374Data( *mBuf );
        mBuf ++;
        Write374Data( *mBuf );
        mBuf ++;
        Write374Data( *mBuf );
        mBuf ++;
    }
    return( mBuf );
}
 
void    CH374_WRITE_BLOCK_C( UINT8 mLen, PUINT8C mBuf )  /* 外部定义的被CH374程序库调用的子程序,向RAM_HOST_TRAN写入常量型数据块 */
{
    Write374Index( RAM_HOST_TRAN );
    do
    {
        Write374Data( *mBuf );
        mBuf ++;
    } while (--mLen);
}
 
阅读(9421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~