本帖最后由 realjace 于 2020-12-1 11:01 编辑
继上一篇:[OKdo E1 - LPC55S69板子] 第二波:外接SPI flash
SPI Flash在使用时,往往是读写速度超高越好。SPI0-SPI7时钟速度只能达到37.5Mhz,即flash的理论读写速度是 4.6875MB/S 。
实际操作中是不可能达到理论值的,所以只能想办法接近。下面列出几种SPI操作方式下的flash读写速度。
1、Polling方式单字节读写512Bytes
写: 花费时间:7.326ms – 1.681ms = 5.6ms,可得写速度为:512bytes/ 5.6ms= 89.28 KB/S
读: 花费时间:4.433ms,速度:512bytes/ 4.433ms = 112.79 KB/S
2、Polling方式连续读写512Bytes
写: 花费时间:3.477ms – 1.676ms = 1.801ms, 可得写速度为:512bytes/ 1.801ms = 277KB/S(相比polling单字提升3倍)
细看每写,有3/4时间被浪费了!即读速度还可提升4倍至 1108 KB/S。
读: 花费时间:839.51us,速度:512bytes/ 839.51us = 595.58 KB/S (相比polling单字提速5.2倍)
细看每次读取,有4/5时间被浪费了!即读速度还可提升5倍至 2977.9KB/S。
3、DMA方式读写512Bytes
写: 花费时间:4.349ms – 1.676ms = 2.673ms, 可得写速度为:512bytes/ 2.673ms = 187KB/S(相比Polling连续写速度还低!)
细看每次写,数据是连续的!所以写的耗时原因是在于指令操作部分,而非定数据部分!
读: 花费时间:377.8875us,速度:512bytes/ 377.8875us = 1323.145KB/S (相比polling单字提速11.7倍)
观察到,写地址部分占用了260ua,那么读取部分实际只用117.8875us, 得出DMA连续读取数据的速度是512bytes/ 117.8875us = 4241.331KB/S (相比polling单字提速38.5倍)
DMA连续读取数据时 时序:
4、DMA方式读写2510字节写:速度46KB/S
读:速度2639.48 KB/S
5、结论 使用DMA连续读写flash速度是最快的,读速度可达到2MB/S以上,但写速度是比较慢的。
附:flash测试程序
- void ext_flash_self_test()
- {
- ext_flash_init();
- #define __SIZE (2510)
- uint32_t addr=0;
-
- ext_flash_erase(FLASH_CMD_SECTOR_ERASE_4K,addr);
-
- static uint8_t wbuf[__SIZE];
- static uint8_t rbuf[__SIZE];
-
- memset(wbuf,0x15,sizeof(wbuf));
-
- addr=addr+100;
- ext_flash_write(addr,sizeof(wbuf),wbuf);
-
- ext_flash_read(addr,sizeof(rbuf),rbuf);
-
- uint8_t check_ok=1;
- for(int i=0;i<sizeof(rbuf);i++)
- {
- if(rbuf[i]!=wbuf[i])
- {
- check_ok=0;
- PRINTF("err r=%x,w=%x,i=%d\r\n",rbuf[i],wbuf[i],i);
- }
- }
- PRINTF("result : %s \r\n\r\n",check_ok? "check_ok":"check err");
- }
复制代码
|