📄 ch375.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 + -