这几天在看使用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;
}
希望能给你们一些帮助!