#include <p24fj256ga106.h>
#include "SD.h"
// --------------------------------------外部变量声明-------------------------------------------
extern uchar SD_Status; //SD卡状态标志位,马文凤添加
extern uchar Operation_feedback_buffer[1034]; //串口接受缓冲区数组
extern unsigned long Read_File_Start; //当前缓冲区中读文件起始地址
extern uint Read_File_Length; //当前缓冲区中读文件长度
extern uchar CreatFileFlag; //建立文件操作标志
// ----------------------------------------变量定义----------------------------------------------
uchar Rec_Data,Rec_End1,Rec_End2; //用于接收数据及判断接收结束同步标志
uchar Total_Capacity[4];
uchar Special_Op_Flag; //特殊操作标志,用于处理大量数据读取操作,如1:文件枚举
uchar Op_flag; //操作功能标志0:取文件个数,>1,取指定文件
uchar RecFileNameArray_Index; //接收文件名数组下标
SendDataLength=0; //发送数据长度
SendDataIndex=0; //发送数据索引
SendDataFlag=0; //发送数据有效标志
int SendDataArray[120];
int Interrupt_Count; //数据接收计数
int Rec_Flag; //接收标志位,0:未接收完数据;1:未已接收完数据
int Rec_State; //接收状态标志,0:未同步;1:已同步
//创建文件:55 aa c0 20 5c 41 2e 54 58 54 20 09 07 0d 0d 14 0f 5f af
//检索文件:55 aa c8 20 5c 2a 2e 2a 20 5f af
//删除文件:55 aa c5 20 5c 41 2e 54 58 54 20 5f af
//重命名: 55 aa c7 20 5c 41 2e 54 58 54 20 43 2e 54 58 54 20 5f af
//总容量: 55 aa ca 5f af 返回(小端模式):00 00 40 75 = 1967128576
//剩余容量:55 aa c9 5f af 返回(小端模式):00 C0 04 75 = 1963245568
// ----------------------------------------函数定义---------------------------------------------
// ======================================================================================
// *功能描述:串口1初始化
// *输入; 无
// *输出:无
// *返回:无
// ======================================================================================
void Init_SD()
{
IEC0bits.U1RXIE=0; //关接收中断
IEC0bits.U1TXIE=0; //关发送中断
U1MODEbits.UARTEN=1; //使能UART1
U1BRG=25; //波特率9600
U1STAbits.UTXEN=1; //设置发送允许
U1STAbits.UTXISEL1=1;
U1STAbits.UTXISEL0=0; //01:当最后一个数据移出发送移位寄存器发送中断标志置1
//10:当一个字符被传输到发送移位寄存器(TSR)导致发送缓冲器为空时,产生中断
IFS0bits.U1TXIF=0; //发送中断标志位
IPC3bits.U1TXIP2=0; //设置发送中断优先级
IPC3bits.U1TXIP1=0;
IPC3bits.U1TXIP0=1;
U1STAbits.URXISEL1=0; //当接收到一个字节时接收中断标志置1
U1STAbits.URXISEL0=1;
IFS0bits.U1RXIF=0; //接收中断标志位
IPC2bits.U1RXIP2=0; //设置接收中断优先级 111为最高
IPC2bits.U1RXIP1=1;
IPC2bits.U1RXIP0=0;
IEC0bits.U1RXIE=1; //开接收中断
IEC0bits.U1TXIE=1; //开发送中断
INTCON2bits.INT0EP=0; //外部中断0边沿检测极性选择,0:上升沿中断,1:下降沿中断
SetSDBaudRate(0xfd); //以下重置串口及SD卡的波特率
U1MODEbits.BRGH=1; //高速模式
}
// ======================================================================================
// *功能描述:设置SD卡波特率
// *输入; 波特率参数br:F4-9600;FA-19200;FD-38400;FE-75600
// *输出:无
// *返回:无
// ======================================================================================
int SetSDBaudRate(uchar br)
{
int ReturnValue; //存储返回值
int SD_Cache[6]; //发送数据缓存区
SD_Cache[0]=0x55; //装配帧头
SD_Cache[1]=0xaa;
SD_Cache[2]=0xcb;
SD_Cache[3]=br;
SD_Cache[4]=0x5f;
SD_Cache[5]=0xaf;
Write_SD(SD_Cache,6); //将命令写入SD卡
if(WaitRetValue(1000000)!=0) //接收超时,等待SD卡返回信息,马文凤修改
{
ReturnValue=-1; //标志位为-1
SD_Status=0xef; //SD卡状态位,马文凤添加
}
else
{
ReturnValue=Operation_feedback_buffer[2]; //返回值为SD卡返回的状态值
}
Rec_State=0; //同步状态清零
Rec_Flag=0; //接收状态清零
Interrupt_Count=0; //中断次数清零
return(ReturnValue); //将执行状态返回
}
// ====================================================================================*
// 功能描述:读取SD卡模块时间
// 输入; 无
// 输出:无
// 返回:马文凤添加
// ====================================================================================
int Read_Time()
{
int ReturnValue=-1; //返回值初始化
int SD_Cache[5]; //发送数据缓存区
SD_Cache[0]=0x55; //装配帧头
SD_Cache[1]=0xaa;
SD_Cache[2]=0xcd;
SD_Cache[3]=0x5f;
SD_Cache[4]=0xaf;
Write_SD(SD_Cache,5); //将命令发送给SD卡
if(WaitRetValue(1000000)!=0) //接收超时,马文凤修改
{
ReturnValue=-1; //返回操作失败
SD_Status=0xED; //sd卡状态,马文凤添加
}
else
{
ReturnValue=Operation_feedback_buffer[2]; //将SD卡剩余容量存入缓存区
}
Rec_State=0; //同步状态清零
Rec_Flag=0; //接收状态清零
Interrupt_Count=0; //中断次数清零
return(ReturnValue); //返回SD卡的执行状态
}
// ======================================================================================
// *功能描述:向SD卡写入数据
// *输入; write_data: 写入SD卡的数据数组,类型定义为int型,实际只取低8位送发送数据缓冲区,高8位丢弃;
// data_length:数组长度
// *输出:无
// *返回
// ======================================================================================
void Write_SD(int *Write_data,int Data_length)
{
int i;
SendDataLength=Data_length; //置发送数据长度
SendDataIndex=0; //置发送数据索引为0
SendDataFlag=1; //置发送数据有效标志
for(i=0;i<Data_length;i++) //将write_data转存到SendDataArray数组中
{
SendDataArray[i]=Write_data[i];
}
U1TXREG=SendDataArray[SendDataIndex]; //发送一个数据起动发送
SendDataIndex++;
}
// ======================================================================================
// *功能描述: 创建文件
// *输入:
// *参数1: uchar *pBuf_1 要创建文件路径
// *参数2: uchar Data_length_1 要创建文件路径长度
// *参数3: uchar *pBuf_2 文件创建时间
// *参数4: uchar Data_length_2 文件创建时间长度
// *输出:无
// *返回:
// *参数1: int ReturnValue 0:操作成功 1:文件已存在 2:创建文件目录失败,
// 3:创建文件失败 -1:超出接收等待时间操作失败
// ======================================================================================
int Create_File(uchar *pBuf_1, uchar Data_length_1,uchar *pBuf_2, uchar Data_length_2)
{
int uchar_ctr;
int ReturnValue; //定义返回值
int SD_Cache[60]; //发送数据缓存区
int Count_1=0; //数组指针
SD_Cache[0]=0x55; //装配帧头
SD_Cache[1]=0xaa;
SD_Cache[2]=0xc0; //装配创建命令字
SD_Cache[3]=0x20;
Count_1=4; //装配分隔符
for(uchar_ctr
评论1