⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch375.c

📁 ch375读U盘程序
💻 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 + -