|
atmega16操作u盘读写模块PB375A例程
[复制链接]
atmega16操作u盘读写模块PB375A例程
在很多工程项目中,电子系统会采集或者生成一些数据需要保存。随着U盘的普及,系统中加入数据保存到U盘已经成为一种不错的选择。该例程就是利用 atmega16的单片机操作PB375A u盘读写模块写入一些数据到U盘中。操作简单,PB375A性价比高,成为很多低端U盘读写应用的重要选择。
PB375A简介
PB375A作为一款低成本的U盘读写单芯片,集成了USB HOST及FAT文件系统。在PB375这款U盘读写芯片基础上增加支持读写SD/MMC卡的功能。其支持SPI及UART两种通信模式,可以让您的单片机开发更加方便。
PB375A有着以下几个特点:
1.单芯片方案
支持符合USB 相关规范基于Bulk-Only 传输协议的各种U 盘/闪存盘/外置硬盘。
完美的将USB HOST及FAT文件系统集成在单芯片中,无需了解USB Host和FAT文件系统,U盘读写操作对于您的现有系统来说只是几个简单的命令。
2.操作方便、指令简单
文件操作功能:新建、删除、读写数据,打开关闭文件等
只需要几个简单的指令即可完成U盘或者SD/MMC卡的读写操作。
3.支持SD/MMC卡读写
只需要简单的设置,即可操作SD/MMC卡,其操作命令与操作U盘一致。
4.多种通信方式
3.3V电平,SPI接口及Uart串口模式,让您的单片机系统有更多的选择。
5.低成本、性价比高
由于是单芯片解决方案,无需一个大容量MCU+USB HOST芯片来构建U盘读写功能,其成本只是上述方案的60%以下。外围元件极少,相对于51MCU+SL811/CH375的模块,无论模块尺寸还是成本都有着极大的优势,让您的系统更有竞争力。
6.对单片机要求低
PB375A集成了文件系统,基本不占用程序空间和RAM空间,单片机只需要几十个字节的RAM空间就可以很方便的操作PB375A.
7.对U盘兼容性高
U 盘、闪盘、闪存盘、USB 移动硬盘、USB 读卡器等
兼容目前市面上的流通的大部分U盘、SD卡、读卡器+卡。
芯片描述
采用了方便、高速、简单的SPI接口和UART接口
· 全速USB 设备接口,兼容USB V2.0,外围元器件只需要晶体和少量的元器件。
· 集成USB1.1 Full Speed Host 收发器
· 支持5V 电源电压。
· 低成本,采用SPI Slave、UART接口。
· 芯片固化FAT12/FAT16/FAT32文件系统。
· LQFP-64-10x10-0.5无铅封装,兼容RoHS。
以下为用ATMEGA16的串口操作PB375A模块进行创建一个1.TXT的文件,并写入数据保存的C程序例子。
#i nclude
#i nclude "D:\ICC_H\CmmICC.H"
#define DISP_PORT PORTB
#define DISP_DDR DDRB
char a1[]={0X3A,0X71,0X00}; //检测U盘
char a2[]={0X3A,0X65,0X06,0X5C,0X31,0X2E,0X54,0X58,0X54}; //新建文件
char a3[]={0X3A,0X7C,0X09,0X5C,0X42,0X6C,0X75,0X65,0X66,0X69,0X76,0X65};//写入数据
char a4[]={0X3A,0X67,0X00}; //关闭文件
//延时子程序
void delayms(unsigned int i)
{
unsigned int j,k;
for (j =0; j < i; j++)
{
for(k = 0; k < 100; k++)
;
}
}
//延时子程序
void delays(unsigned int i)
{
unsigned int j,k,d;
for(j=0;j
{
for(k=0;k<1000;k++)
{
for(d=0;d<100;d++)
;
}
}
}
//初始化串口
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 47; //set baud rate lo,波特率为9.6K
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98; //接收中断允许,接收缓冲自动清空,接收允许
}
//接收中断程序
#pragma interrupt_handler uart0_rx_isr:12 //中断程序
void uart0_rx_isr(void)
{
DISP_PORT = UDR;
}
//初始化单片机
void mcu_init(void)
{
CLI(); //全局中断标志禁止
uart0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts 全局中断标志使能
}
//检测U盘存在命令
//a1数组中的数据为0X3A,0X71,0X00
// 0x3A--串口通信起始符
// 0x71--检测U盘是否存在
// 0x00--数据包长度为0
void CMD_DiskReady()
{
char i=0;
for(i=0;i<3;i++)
{
UDR=a1;
delayms(10);
}
delays(1);
}
//新建文件 1.TXT
//a2数组中的数据为0X3A,0X65,0X06,0X5C,0X31,0X2E,0X54,0X58,0X54
// 0x3A--串口通信起始符
// 0x65--新建文件命令码
// 0x06--数据包长度为6 即/1.TXT 字符串的长度
// 0X5C,0X31,0X2E,0X54,0X58,0X54 为/1.TXT 的ascii码的十六进制数据
void CMD_FileCreate()
{
char j=0;
for(j=0;j<9;j++)
{
UDR=a2[j];
delayms(10);
}
delays(1);
}
//写入数据 Bluefive
//a3数组中的数据为0X3A,0X7C,0X09,0X5C,0X42,0X6C,0X75,0X65,0X66,0X69,0X76,0X65
// 0x3A--串口通信起始符
// 0x7C--新建文件命令码
// 0x09--数据包长度为6 即要写入数据的长度
// 0X5C,0X42,0X6C,0X75,0X65,0X66,0X69,0X76,0X65 要写入数据 的ascii码的十六进制数据
void CMD_ByteWrite()
{
char d=0;
for(d=0;d<12;d++)
{
UDR=a3[d];
delayms(10);
}
delays(1);
}
//关闭文件 1.TXT
//关闭文件命令
//a3数组中的数据为0X3A,0X67,0X00
// 0x3A--串口通信起始符
// 0x67--关闭文件命令码
// 0x00-数据包长度为0
void CMD_FileClose()
{
char k=0;
for(k=0;k<9;k++)
{
UDR=a4[k];
delayms(10);
}
delays(1);
}
//主程序
void main()
{
DDRB=0xff;
PORTB=0x0f;
mcu_init();
CMD_DiskReady(); //测试U盘是否存在
delays(40);
//需要根据串口返回数据判断U盘是否存在
CMD_FileCreate();
delays(40);
//需要根据串口返回数据判断文件是否创建成功
CMD_ByteWrite();
delays(40);
//需要根据串口返回数据判断数据是否写入成功
CMD_FileClose();
//需要根据串口返回数据判断文件是否关闭
while(!(UCSRA&0x40)); //等待发送结束
UCSRA|=0x40; //清除发送结束标志位
delays(40);
while(1)
{
//主程序
delayms(50);
}
}
|
|