SPI - flash代码分析(4)
void SF_bulk_erase (Xuint32 BaseAddress) {
Xuint8 op_code, bogus_data; // FLASH写使能
SF_write_enable(BaseAddress); SPI_FLASH_CS_LOW(); // 发送FLASH块擦除命令 op_code = BE;
spi_transfer(BaseAddress, &op_code, &bogus_data, 1); SPI_FLASH_CS_HIGH();
// 等待写寄存器/编程/擦除命令操作结束 poll_until_complete(BaseAddress); // FLASH写不使能
SF_write_disable(BaseAddress); }
以下是数据手册上关于指令BE的相关描述
首先给flash发送一条写使能指令WREN,然后选中该flash从设备,向flash发送BE整块擦除指令。关闭该flash从设备以使任何一个从设备都处于不选中状态以使FLASH进入the self-timed Bulk Erase cycle周期。查询FLASH的status register看是否已经擦除完毕。最后给flash传输一个写不使能指令WRDI指令以使flash不能再被写入。
6、 SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); 该函数的定义如下:
void SF_start_read (Xuint32 BaseAddress, Xuint8 sector_address, Xuint8 page_address, Xuint8 page_offset, Xuint8 speed_setting) {
Xuint8 op_code[5], bogus_data[5]; SPI_FLASH_CS_LOW();
// 发送SPF FLASH 读命令或快速读命令 if(speed_setting) op_code[0] = FAST; else
op_code[0] = READ;
op_code[1] = sector_address; op_code[2] = page_address; op_code[3] = page_offset; op_code[4] = DUMMY_BYTE; if(speed_setting)
spi_transfer(BaseAddress, op_code, bogus_data, 5); else
spi_transfer(BaseAddress, op_code, bogus_data, 4); }
以下是数据手册关于flash读操作read指令和快速读操作指令fast-read的描述
该函数首先选中flash从设备,然后根据是否是快速读操作传输5个字节或者4个字节。第一个字节是读操作或者快速读操作指令,紧接着三个字节是地址,假如是快速读操作的话第五个字节代表空转字节的个数即忽略多少个开始读出的数据字节数。 SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00,
SCK_FASTER_THAN_20MHz);这句话代表向flash传输READ指令和地址为0x000000.
7、 error = 0;
for (i = 0; i < SF_BYTES/16; i++) {
/*每次接收16个字节 校验*/
spi_transfer(XPAR_SPI_FLASH_BASEADDR,send_data, recv_data, 16); for (j = 0; j < 16; j++) {
if(recv_data[j] != 0xFF) {
xil_printf(\ j = 16;
i = SF_BYTES; error = 1; } } }
if(!error)
xil_printf(\
代表每次接收16个字节并且检测该16个字节是否都为0Xff,假如是的话正常,否则输出错误信息。
8、SF_end_read (XPAR_SPI_FLASH_BASEADDR);下面是该函数的定义 void SF_end_read (Xuint32 BaseAddress) {
SPI_FLASH_CS_HIGH(); }
关闭flash从设备以使任何一个设备都没有选中。
9、for(sector_select = 0; sector_select < SF_SECTORS; sector_select++) for(page_select = 0; page_select < SF_PAGES_PER_SECTOR; page_select++) {
/*发送 page编程命令 */
SF_start_page_program (XPAR_SPI_FLASH_BASEADDR, sector_select, page_select, 0x00);
for (i = 0; i < SF_BYTES_PER_PAGE; i+=16) {
for(j = 0; j < 16; j++) send_data[j] = i + j; /*每次发送16个字节 */
spi_transfer(XPAR_SPI_FLASH_BASEADDR,send_data, recv_data, 16); }
SF_end_page_program (XPAR_SPI_FLASH_BASEADDR); }
xil_printf(\
下面我们首先看函数SF_start_page_program (XPAR_SPI_FLASH_BASEADDR, sector_select, page_select, 0x00);的定义
void SF_start_page_program (Xuint32 BaseAddress, Xuint8 sector_address, Xuint8 page_address, \\
Xuint8 page_offset) {
Xuint8 op_code[4], bogus_data[4];
// FLASH写使能
SF_write_enable(BaseAddress);
SPI_FLASH_CS_LOW();
// 发送page编程命令 op_code[0] = PP;
op_code[1] = sector_address; op_code[2] = page_address; op_code[3] = page_offset;
spi_transfer(BaseAddress, op_code, bogus_data, 4); }
以下是数据手册关于PP指令的描述
…… 此处隐藏:761字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




