最近有个客户要求在产品上使用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) |