CH376s驱动的小改动

这几天在看使用CH376S进行U盘的读写,但是在一开始的时候就遇到问题了,如下:

/*******************************************************************************
* 函  数  名      : xReadCH376Status
* 描      述      : 从CH376读状态,仅用于并口方式.
* 输      入      : 无.
* 返      回      : UINT8 i:
*					当前状态.
*******************************************************************************/
UINT8	xReadCH376Status( void )
{
	UINT8 i;

	i = CH376_CMD_PORT; 
	return ( i ); 
}

/*******************************************************************************
* 函  数  名      : xWriteCH376Cmd
* 描      述      : 向CH376写命令.
* 输      入      : 无.
* 返      回      : 无.
*******************************************************************************/
void 	xWriteCH376Cmd( UINT8 mCmd )
{
	UINT8	i;

	CH376_CMD_PORT = mCmd;
	for ( i = 0; i < 100; i++ ) 															/* 状态查询,等待CH376不忙 */
	{  
		if ( ( xReadCH376Status( ) & PARA_STATE_BUSY ) == 0 )                           /* 检查状态端口的忙标志位 */    
		{
		    break;  					
		}
	}
}

/*******************************************************************************
* 函  数  名      : xWriteCH376Data
* 描      述      : 向CH376写数据.
* 输      入      : UINT8 mData:
*					写入的数据.
* 返      回      : 无.
*******************************************************************************/
void 	xWriteCH376Data( UINT8 mData )
{
	CH376_DAT_PORT = mData;
/* 此处需要确保读写周期大于0.6uS,对于51单片机,无需延时,对于快速单片机,
   根据情况延时 */

   mDelayuS(10);
}

/*******************************************************************************
* 函  数  名      : xReadCH376Data
* 描      述      : 从CH376读数据.
* 输      入      : 无.
* 返      回      : 读出的数据.
*******************************************************************************/
UINT8	xReadCH376Data( void )
{
/* 此处需要确保读写周期大于0.6uS,对于51单片机,无需延时,对于快速单片机,
   根据情况延时 */
   mDelayuS(10);
   return( CH376_DAT_PORT );
}

上面的代码直接操作(CH376_DAT_PORT和CH376_CMD_PORT ),而在这里面都是用的是I/O对应地址,实在是看不懂,下面编写的代码为原代码:

/********************************* CH376 总线地址 *******************************/
UINT8V	xdata	CH376_CMD_PORT	_at_ 0xBDF1;											/* CH376命令端口的I/O地址 */
UINT8V	xdata	CH376_DAT_PORT	_at_ 0xBCF0;											/* CH376数据端口的I/O地址 */

有点很难理解,所以就自己按照理解换了种方式进行数据和命令的读写,以下是我的代码:

//描述:      初始化通讯接口
//名称:      CH376_PORT_INIT
void CH376_PORT_INIT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//PB6 -- INT PB7 -- WR PB8 -- RD PB9 -- A0 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50M Hz	
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	PBout(7) = 1;//WD执行写操作
	PBout(8) = 1;//RD执行写操作
}
//描述:      初始化数据端口为输入
//名称:      D07_PORTIN_INIT
void D07_PORTIN_INIT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//D0-7 PC0-7
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50M Hz	
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//描述:      初始化数据端口为输出
//名称:      D07_PORTOUT_INIT
void D07_PORTOUT_INIT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//D0-7 PC0-7
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50M Hz	
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//描述:      向CH376写命令
//名称:      xWriteCH376Cmd
//输入参数:  u8Cmd -- 命令
//输出参数:  无
//返回值:    无
//说明:      无
void xWriteCH376Cmd(u8 u8Cmd)
{
    u8 i;
	PBout(9) = 1;//A0 = 1写入命令码
	delay_us(1);//延时4ns以上
	D07_PORTOUT_INIT();
    for(i = 0;i<8;i++)
	{
		PCout(i) = u8Cmd>>i;
	}
	PBout(7) = 0;//WD执行写操作
	delay(270);//延时4ns以上
	PBout(7) = 1;//WD执行写操作
}
//描述:      向CH376写数据
//名称:      xWriteCH376Data
//输入参数:  u8Data -- 数据
void xWriteCH376Data(u8 u8Data)
{
    u8 i = 0;
	PBout(9) = 0;//A0 = 0写数据
	delay_us(1);//延时4ns以上
	D07_PORTOUT_INIT();
	delay(270);
	 for(i = 0;i<8;i++)
	{
		PCout(i) = u8Data>>i;
		delay_us(10);
	}
	PBout(7) = 0;//WD执行写操作
	delay(270);//延时4ns以上
	PBout(7) = 1;//WD执行写操作
}
//描述:      从CH376读数据
//名称:      xReadCH376Data
//输入参数:  无
//输出参数:  无
//返回值:    u8 -- 总线数据
//说明:      无
u8 xReadCH376Data(void)
{
    u16 u16Temp = 0;
	PBout(9) = 0;//A0 = 0写数据
	delay_us(1);//延时4ns以上
	D07_PORTIN_INIT();
	PBout(8) = 0;//WD执行写操作
	delay(270);//延时4ns以上
    u16Temp = GPIOC->IDR;
	delay(500);//延时4ns以上
	PBout(8) = 1;//WD执行写操作
    delay_us(10);
    return (u8)u16Temp;
}

希望能给你们一些帮助!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值