用372或375将FPGA配置数据(.rbf二进制文件)存放在U盘,MCU按字节读到累加器A,怎么编程?[Emot]27[/Emot][Emot]27[/Emot][Emot]27[/Emot]
如果是单片机操作U盘的话,那么只能用CH375,你可以这样做,你只要将你的FPGA的数据送到单片机里面去,接着将这些数据复值到375定义的缓冲区里面就可以写了。
"单片机系统可以直接使用CH375读写U 盘,将U盘当作大容量闪存使用。与SRAM-6264 兼容;“ 问题是:1、6264是8K的,此时U盘可以是多大容量,怎样寻地址,地址怎样确定? 2、用MOVX A,@DPTR MOVX @DPTR,A 直接进行读写吗? 急切盼望回答!谢谢
下面是电子盘模块CH375EDM 的电路图,用于插入在兼容SRAM-6264 引脚的DIP28 插座中。 单片机系统应该提供兼容SRAM-6264引脚的DIP28插座,电子盘模块应该插入该DIP28插座中, 然后在电子盘的模块的P1 端口插入U 盘(USB 闪存盘)或者通过USB 延长线插入U 盘。 以原SRAM-6264 的片选地址作为基址,各端口地址如下: 基址加0 的地址为CH375 的数据端口, 基址加1 的地址为CH375 的命令端口, 基址加2 的地址为CH375 的状态端口,其中位0 为CH375 的INT#引脚状态。 要使用电子盘模块,单片机系统必须给DIP 插座提供以下信号: 低电平有效的CE#片选信号和高电平有效的CE 片选信号,与SRAM-6264 兼容; 低电平有效的RD#/OE#读选通信号,低电平有效的WR#/WE#写选通信号,与SRAM-6264 兼容; 地址线A1 和A0,双向数据总线D7-D0,与SRAM-6264 兼容; 可选的中断信号,从DIP28 插座的第1 脚输出,当跳线J1 连接1-2 时提供低电平中断信号,当 跳线J1 连接2-3 时提供高电平中断信号。 单片机系统可以直接使用CH375读写U 盘,将U盘当作大容量闪存使用。如果需要使用文件系统 以文件格式读写数据,可以使用CH375的U 盘文件级子程序库,只要在程序中设置正确的端口地址, 相关的示例程序都可以直接使用。 电子盘模块支持中断方式和查询方式,使用中断方式需要连接电子盘模块的第1 脚到单片机的中 断请求输入引脚并用跳线J1 选择中断电平,使用查询方式是通过电子盘模块的状态端口的位0 查询 CH375 的INT#引脚状态,从而可以为单片机节约一个I/O 引脚。
1,我们在操作U盘的物理扇区的时候,首先是给出要读或者要写的U盘的扇区号,给定了扇区号之后,就可以发送写命令了,接着就往下面写数据。我们定义的扇区好是32位的,也就是说对于现在一般的U盘都可以支持。 2,是这样直接的读和写。
请原谅,我现在不能做实验,所以有的问题无法实验验证解决。只好再请教您
1、用MOVX A,@DPTR MOVX @DPTR,A 直接进行读写,要知道地址, MOV DPTR, xxxxH, U盘地址xxxxH到底是什么? 0000H-FFFFH吗?,还是别的? 不懂啊!!!
2、资料上讲“要使用电子盘模块,单片机系统必须给DIP 插座提供以下信号: 低电平有效的CE#片选信号和高电平有效的CE 片选信号,与SRAM-6264 兼容; 低电平有效的RD#/OE#读选通信号,低电平有效的WR#/WE#写选通信号,与SRAM-6264 兼容; 地址线A1 和A0,双向数据总线D7-D0,与SRAM-6264 兼容;” 怎么地址线只用 A1 和A0,不用A2---A12?
3、因为急用,有没有“PC将二进制文件如mux21a.rbf拷到U盘,MCU将U盘上的二进制文件通过电子盘模块读到累加器A”类似的程序,或编程流程,请发到个人信息保护,已隐藏或QQ:1881003上。
单片机系统可以直接使用CH375读写U 盘,将U盘当作大容量闪存使用。与SRAM-6264 兼容;“ 问题是:1、6264是8K的,此时U盘可以是多大容量,怎样寻地址,地址怎样确定? 2、用MOVX A,@DPTR MOVX @DPTR,A 直接进行读写吗?
MOV DPTR, xxxxH指的是数据端口地址和命令端口地址,真正决定375命令端口地址和数据端口地址的就是375和单片机相连接的A0和CS线
27 CS# 输入 片选控制输入,低电平有效,内置上拉电阻
8 A0 输入 地址线输入,区分命令口与数据口,内置上拉电阻, 当A0=1 时可以写命令,当A0=0 时可以读写数据
用电子盘模块CH375EDM ,“单片机系统可以直接使用CH375读写U 盘,将U盘当作大容量闪存使用,与SRAM-6264 兼容”,能不能理解成“直接对SRAM-6264 读写,就好象没用CH374 + U盘”?不需要想以下程序一样对CH375初始化,设置USB工作模式。。。
/* 计算机应用程序将某个文件的数据通过USB下传到单片机的RAM中,本程序中单片机再将数据从串口输出,相当于USB转串口,供参考 */ /* ; CH375/CH372 Bulk Data Download ; U2(AT89C51) Program ; 本程序测试收大数据块 ; 本程序适用于时钟频率不高于24MHz的标准MCS-51单片机 ; ; Website: http://winchiphead.com ; Email: 个人信息保护,已隐藏 ; Author: W.ch 2003.09 */
/* MCS-51单片机C语言的示例程序 */
#include #include "CH375INC.H"
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */
unsigned char xdata data_buffer[0x8000] _at_ 0x0000; unsigned char xdata *p_xram; unsigned char xdata *p_ser;
/* 延时2微秒,不精确 */ void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); }
/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 设置USB工作模式, 必要操作 */ CH375_CMD_PORT = CMD_SET_USB_MODE; Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ CH375_DAT_PORT = 2; /* 设置为使用内置固件的USB设备方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件错误 }; */ /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }
/* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char length; CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端点下传成功 */ CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ if ( length == 0 ) /* 如果长度为0说明计算机将要开始下传一个新的文件 */ { p_xram=data_buffer; /* 将指针初始化以便接收 */ p_ser=data_buffer; } else /* 长度不为0则说明是下传文件数据,接收到缓冲区中,再由主程序处理串口发送 */ { do { *p_xram = CH375_DAT_PORT; p_xram++; } while ( --length); if ( p_xram >= 0x7f80 ) p_xram=data_buffer; /* 防止XRAM溢出,这是简单处理,实际产品应该处理严密些 */ }
} else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 释放当前USB缓冲区 */ }
main( ) { Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ // Init serial baudrate PCON = 0x80; SCON = 0x50; /* 8位串行数据 */ TL2 = RCAP2L = 0xf6;//0 - RetLen; /* 18.432MHz, 57600bps */ TH2 = RCAP2H = 0xFF; T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */ TI = 0; RI = 0; /* 清除中断标志 */ // ? EA = 1; /* 允许中断 */ p_xram=data_buffer; p_ser=data_buffer; while ( 1 ) { /* 以下指令开始工作循环,等待PC机命令进行操作 */ if(p_ser { SBUF=*p_ser; while(!TI); TI=0; p_ser++; } } }
main( ) { Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ // Init serial baudrate PCON = 0x80; SCON = 0x50; /* 8位串行数据 */ TL2 = RCAP2L = 0xf6;//0 - RetLen; /* 18.432MHz, 57600bps */ TH2 = RCAP2H = 0xFF; T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */ TI = 0; RI = 0; /* 清除中断标志 */ // ? EA = 1; /* 允许中断 */ p_xram=data_buffer; p_ser=data_buffer; while ( 1 ) { /* 以下指令开始工作循环,等待PC机命令进行操作 */ if(p_ser { SBUF=*p_ser; while(!TI); TI=0; p_ser++; } } }