📄 ch375.c
字号:
#include "CH375INC.H"
#include "board.h"
#include "fat.h"
#include "uart.h"
unsigned char DataBuff[512];
extern unsigned char FatFlags;
void DelayIni(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xE1; //set count
}
void delay_ms(unsigned char ms)
{
TCCR0 = 0x04; //start timer
while(ms--)
{
while((TIFR & (1<<TOV0)) != (1<<TOV0));
TIFR |= (1<<TOV0);
TCNT0 = 0xE1;
}
TCCR0 = 0x00; //stop
}
void portIni(void)
{
OSCCAL = 0xA3;
PORTB = MSK_CH; //high
DDRB = MSK_CH; //port out
PORTB = MSK_CH; //high
PORTD |= INT_CH; //pull-up
DelayIni();
}
inline void delay_us(unsigned char us)
{
while(us--)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
/*==========================================================
// function: write command
// Parameter: cmd command
// return: void
// date: 2006/12/17
// note: CH375DS1 page 11
// write: han
==========================================================*/
inline void WriteCmd(unsigned char cmd)
{
DataPort = 0xFF;
DataOut = cmd;
PORTB |= A0_CH; //command mode
PORTB &= ~CS_CH;
PORTB &=~WR_CH; //write command
PORTB |= WR_CH;
PORTB |= CS_CH; //write end
delay_us(2); //must delay 2us
}
/*==========================================================
// function: write data
// Parameter: data data for write
// return: void
// date: 2006/12/17
// note: CH375DS1 page 11
// write: han
==========================================================*/
inline void WriteData(unsigned char data)
{
DataPort = 0xFF;
DataOut = data;
PORTB &= ~A0_CH; //data mode
PORTB &= ~CS_CH;
PORTB &=~WR_CH; //write data
PORTB |= WR_CH;
PORTB |= CS_CH; //write end
delay_us(1); //must delay 1us
}
/*==========================================================
// function: read data
// Parameter: void
// return: unsigned char data read
// date: 2006/12/17
// note: CH375DS1 page 11
// write: han
==========================================================*/
inline unsigned char ReadData(void)
{
unsigned char data;
DataPort = 0;
PORTB &= ~A0_CH; //data mode
PORTB &= ~CS_CH;
PORTB &=~RD_CH; //read data sign
asm("nop");
data = DataIn; //data read
PORTB |= RD_CH;
PORTB |= CS_CH; //read end
delay_us(1); //must delay 1us
return data;
}
/*==========================================================
// function: read interrupt status with wait interrupt
// Parameter: void
// return: unsigned char status
// date: 2006/12/17
// note: CH375DS1 page 4
// write: han
==========================================================*/
unsigned char GetInt( void )
{
while(INT_CH == (INT_CH & PIND)); //等待中断产生
WriteCmd(CMD_GET_STATUS); //清除中断并获取中断状态
return(ReadData());
}
/*==========================================================
// function: init disk
// Parameter: void
// return: unsigned char status
// date: 2006/12/17
// note: CH375DS1 page 5
// write: han
==========================================================*/
unsigned char InitDisk(void)
{
unsigned char stat;
unsigned char *buff;
unsigned char i;
buff = DataBuff;
WriteCmd(CMD_GET_STATUS);
stat = ReadData();
if(stat == USB_INT_DISCONNECT)
return(stat); //USB设备断开
WriteCmd(CMD_DISK_INIT); //初始化USB存储器
stat = GetInt();
if(stat != USB_INT_SUCCESS)
return(stat);
WriteCmd(CMD_DISK_SIZE); //获取USB存储器容量
stat = GetInt();
if(stat != USB_INT_SUCCESS)
{
delay_ms(250);
WriteCmd(CMD_DISK_SIZE); //再次尝试
stat = GetInt();
}
if(stat != USB_INT_SUCCESS)
return(stat);
WriteCmd(CMD_RD_USB_DATA);
i = ReadData();
for(; i > 0; i--)
*buff++ = ReadData(); //容量数据,参看数据手册5-6
return(0); //初始化成功
}
/*==========================================================
// function: init disk
// Parameter: void
// return: unsigned char status
// date: 2006/12/17
// note: CH375DS1 page 6
// write: han
==========================================================*/
unsigned char ReadSector(unsigned long iLbaStart,unsigned char *buf)
{
unsigned char i;
unsigned char c;
WriteCmd(CMD_DISK_READ); /* 从USB存储器读数据块 */
WriteData((unsigned char)iLbaStart); /* LBA的最低8位 */
WriteData((unsigned char)(iLbaStart >> 8));
WriteData((unsigned char)(iLbaStart >> 16));
WriteData((unsigned char)(iLbaStart >> 24)); /* LBA的最高8位 */
WriteData(1); //扇区数1
for(i = 8; i > 0; i--)
{
c = GetInt();
if(c == USB_INT_DISK_READ)
{
WriteCmd(CMD_RD_USB_DATA);
c = ReadData();
while(c--)
*buf++ = ReadData();
WriteCmd(CMD_DISK_RD_GO);
}
else
break;
}
if(i == 0)
{
c = GetInt();
if(c == USB_INT_SUCCESS)
return 0;
}
return c;
}
//为庆祝2007年元旦,特赶工编写,祝大家新年快乐!
int main(void)
{
volatile unsigned char i;
unsigned char show[5];
unsigned long Clustervar;
unsigned char Dir_Attrib = 0;
unsigned long Size = 0;
unsigned char a;
unsigned int tmp;
portIni();
InitUSART();
PORTB |= RST_CH;
delay_ms(50);
PORTB &= ~RST_CH;
delay_ms(50);
WriteCmd(CMD_GET_IC_VER); //读固件版本
i = ReadData();
WriteCmd(CMD_CHECK_EXIST); //工作测试,送5A正确应该读到A5
WriteData(0x5A);
i = ReadData();
if(i == 0xA5)
TransmitBytes("CH375 work ok!\r\n");
WriteCmd(CMD_SET_USB_MODE); // 初始化CH375,设置USB工作模式
WriteData(6); // 模式代码,自动检测USB设备连接
while(1)
{
do
{
i = GetInt();
asm("NOP");
}
while(i != USB_INT_CONNECT); // 等待U盘连接
delay_ms(250); // 延时等待U盘进入正常工作状态
i = InitDisk( ); // 初始化U盘,实际是识别U盘的类型,必须进行此步骤
if(i == 0)
{
for (a = 1;a < 240;a++)
{
Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,DataBuff);
if (Clustervar == 0xffff)
{
break;
}
if(FatFlags == FAT_Flg_12)
TransmitBytes("Fat12\r\n");
if(FatFlags == FAT_Flg_16)
TransmitBytes("Fat16\r\n");
if(FatFlags == FAT_Flg_32)
TransmitBytes("Fat32\r\n");
tmp = (Size & 0x0000FFFF);
TransmitBytes("Clustervar = 0x");
show[0] = (Clustervar>>12)+0x30;
show[1] = ((Clustervar>>8)&0x0F)+0x30;
show[2] = ((Clustervar>>4)&0x0F)+0x30;
show[3] = (Clustervar&0x0F)+0x30;
show[4] = 0;
TransmitBytes(show);
TransmitBytes(";Dir_Attrib = 0x");
show[0] = ((Dir_Attrib>>4)&0x0F)+0x30;
show[1] = (Clustervar&0x0F)+0x30;
show[2] = 0;
TransmitBytes(show);
TransmitBytes(";Size = 0x");
show[0] = (tmp>>12)+0x30;
show[1] = ((tmp>>8)&0x0F)+0x30;
show[2] = ((tmp>>4)&0x0F)+0x30;
show[3] = (tmp&0x0F)+0x30;
show[4] = 0;
TransmitBytes(show);
TransmitBytes(";FileName = ");
TransmitBytes(DataBuff);
TransmitBytes("\r\n");
}
//TransmitBytes("Directory Ende\r\n");
Clustervar = 0;
}
while(GetInt() != USB_INT_DISCONNECT); // 等待U盘拔出
delay_ms(250);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -