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

📄 ch375.c

📁 使用AVR单片机控制USB芯片CH375读写U盘
💻 C
字号:
#include"ch375.h"


//cs 脚的宏定义
#define CH375_CS_H() CH375_CS_PORT |=  (1<<CH375_CS_BIT)
#define CH375_CS_L() CH375_CS_PORT &= ~(1<<CH375_CS_BIT)

void CH375_DelayNus(uint16 n)//不精确
{
	while(n--);
}

void CH375_DelayNms(uint16 n)//不精确
{
	while(n--)CH375_DelayNus(1000);
}

void CH375_PortIni()
{
	MCUCR |= (1<<SRE);							//使能总线
	CH375_CS_DDR  |= (1<<CH375_CS_BIT);			//cs输出
	CH375_CS_PORT |= (1<<CH375_CS_BIT);
	CH375_INT_DDR  &= ~(1<<CH375_INT_BIT);		//int输入
	CH375_INT_PORT |=  (1<<CH375_INT_BIT);
}

//CH375写命令
void CH375_WriteCMD(uint8 _CMD)
{
	CH375_CS_L();				//使能芯片
	CH375_CMD_PORT = _CMD;		//写命令
	CH375_CS_H();				//禁止芯片
	CH375_DelayNus(2);			//延时
}

//CH375写数据
void CH375_WriteDAT(uint8 _DAT)
{
	CH375_CS_L();
	CH375_DAT_PORT = _DAT;
	CH375_CS_H();
	CH375_DelayNus(2);
}

//CH375度数据
uint8 CH375_ReadDAT(void)
{
	uint8 temp;
	CH375_DelayNus(2);
	CH375_CS_L();
	temp = CH375_DAT_PORT;
	CH375_CS_H();
	return temp;
}

//CH375等待中断,并返回中断状态
uint8 CH375_WaitInterrupt()
{
	uint8 temp;
	while(CH375_INT_PIN & (1<<CH375_INT_BIT));
	CH375_WriteCMD(GET_STATUS);
	temp = CH375_ReadDAT();
	return temp;
}

//初始化U盘
uint8 CH375_IniDisk(void)
{
	CH375_WriteCMD(RESET_ALL);			//复位全部
	CH375_DelayNms(40);					//延时40ms
	CH375_WriteCMD(CHECK_EXIST);		//检查芯片是否存在
	CH375_WriteDAT(0x55);				//填数据0x55 取反为0xaa
	if(CH375_ReadDAT() != 0xaa)return 1;//不存在则退出
	CH375_WriteCMD(SET_USB_MODE);		//设置CH375模式
	CH375_WriteDAT(HOST_ACTIVE_EOF);	//主机模式,自动产生EOF
	CH375_DelayNus(20);					//延时20us
	if(CH375_WaitInterrupt() != USB_INT_CONNECT)return 1;//不成功责返回
	CH375_DelayNms(100);				//延时500ms让U盘准备好
	CH375_WriteCMD(DISK_INIT);			//初始化U盘
	if(CH375_WaitInterrupt() != USB_INT_SUCCESS)return 1;//不成功则退出
	return 0;							//正常返回0
}

//CH375读一个扇区
uint8 CH375_ReadOneSector(uint32 LBA,uint8 *buffer)
{
	uint8 cnt = 8;					//数据需分8次读		
	uint8 temp;						//单次数据长度
	CH375_WriteCMD(DISK_READ);		//发读命令
	CH375_WriteDAT(LBA);			//填充目的地址
	CH375_WriteDAT(LBA>>8);
	CH375_WriteDAT(LBA>>16);
	CH375_WriteDAT(LBA>>24);
	CH375_WriteCMD(1);				//读一个扇区
	while(cnt--)
	{
		if(CH375_WaitInterrupt() != USB_INT_DISK_READ)break;	//等待就绪 出错跳出
		CH375_WriteCMD(RD_USB_DATA);							//发读数据命令
		temp = CH375_ReadDAT();									//读数据长度
		while(temp--)*buffer++ = CH375_ReadDAT();				//依次读出数据
		CH375_WriteCMD(DISK_RD_GO);								//发继续命令
	}
	if(cnt != 0xff || CH375_WaitInterrupt() != USB_INT_SUCCESS)return 1;//如果出错则返回1
	return 0;														//正常返回0
}

//CH375写一个扇区
uint8 CH375_WriteOneSector(uint32 LBA,uint8 *buffer)
{
	uint8 cnt = 8;						//数据需分8次送出
	uint8 temp = 64;					//每次64字节
	CH375_WriteCMD(DISK_WRITE);			//发写命令
	CH375_WriteDAT(LBA);				//填充目的地址
	CH375_WriteDAT(LBA>>8);
	CH375_WriteDAT(LBA>>16);
	CH375_WriteDAT(LBA>>24);
	CH375_WriteCMD(1);					//写一个扇区
	while(cnt--)
	{
		if(CH375_WaitInterrupt() != USB_INT_DISK_WRITE)break;		//等待就绪 出错则跳出
		CH375_WriteCMD(WR_USB_DATA7);								//发写数据命令
		CH375_WriteDAT(64);											//设定数据长度
		while(temp--)CH375_WriteDAT(*buffer++);						//依次送出数据
		CH375_WriteCMD(DISK_WR_GO);									//发继续写命令
	}
	if(cnt != 0xff || CH375_WaitInterrupt() != USB_INT_SUCCESS)return 1;//出错则退出
	return 0;														//正常返回0
}


/* This is the end of file CH375.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -