SPI - flash代码分析
SPI_flash代码分析
以下是主函数
int main(void) {
Xuint8 send_data[16], recv_data[16]; Xuint8 error, SF_sr;
Xuint16 sector_select, page_select; Xuint32 i, j;
xil_printf(\); /* 初始化 FLASH_SPI控制器 */ //1、初始化SPI
//2、设这控制寄存器CR为主MASTER transaction inhibit disable,人工选择从设备以及设置SPI为master
//3、初始化SSR(从设备选择寄存器)为不选择任何一个从设备。 Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR); /* 使能SPI控制器 */
// Description : 设置SPICR寄存器的SPI System Enable位 //1、设置SPE=1,SPI SYSTEM ENABLE
XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR);
/* 设置FLASH的WRSR寄存器,设置成功说明FLASH控制已经OK */ do { //设置FLASH以使FLASH任何一部分都受保护protected
SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x7C);
/* 设置FLASH的WRSR寄存器,使能All sector可写 */ do {
//设置FLASH以使FLASH任何一部分都不受保护protected
SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x00); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x00);
/*整片擦除 */
xil_printf(\); SF_bulk_erase(XPAR_SPI_FLASH_BASEADDR);
xil_printf(\);
/*整片校验看是不是全0XFF*/
SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); 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(\, i,j);
j = 16;
i = SF_BYTES; error = 1; } } }
if(!error)
xil_printf(\);
SF_end_read (XPAR_SPI_FLASH_BASEADDR); /*SPI FLASH page编程*/
xil_printf(\);
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(\, i);
/*SPI FLASH 读取数据进行验证*/
SF_start_read (XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); error = 0;
for (i = 0; i < SF_BYTES; i+=16) {
/*每次读取16个字节进行验证 */
spi_transfer(XPAR_SPI_FLASH_BASEADDR,send_data, recv_data, 16); for(j = 0; j < 16; j++) {
if(recv_data[j] != ((i + j) & 0xFF)) {
xil_printf(\, i,j); xil_printf(\, recv_data[j]); xil_printf(\, (i+j)); j = 16;
i = SF_BYTES; error = 1; } } }
if(!error)
xil_printf(\); else xil_printf(\); SF_end_read (XPAR_SPI_FLASH_BASEADDR); return 0; }
接下来我们一句一句话分析主函数main()
1、Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR); 以下是这个函数的定义
#define Initialize_Spi_Controller(BaseAddress) \\ { \\
XSpi_WriteReg(BaseAddress, XSP_SRR_OFFSET,XSP_SRR_RESET_MASK); \\ XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, INIT_CREG); \\ XSpi_WriteReg(BaseAddress, XSP_SSR_OFFSET, SPI_NONE_SELECT); \\ }
这三句话分别代表的含义是:
XSpi_WriteReg(BaseAddress, XSP_SRR_OFFSET,XSP_SRR_RESET_MASK);代表
初始化FPGA内部SPI接口的reset register,即重置FPGA内部SPI接口。以下是关于寄存器SRR的描述。
通过文档《xps_spi.pdf》有关SRR的描述,只能向SRR中写入0x0000000A.
XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, INIT_CREG);代表初始化FPGA内部的SPI接口中的控制寄存器control register,以下是关于CR控制寄存器的描述
写入的值为
#define INIT_CREG (XSP_CR_TRANS_INHIBIT_MASK | XSP_CR_MANUAL_SS_MASK | XSP_CR_MASTER_MODE_MASK)代表禁止FPGA内部的SPI接口传输数据,人工选择从设备,FPGA内部的SPI接口为主设备master
XSpi_WriteReg(BaseAddress, XSP_SSR_OFFSET, SPI_NONE_SELECT);以下是SSR寄存
器的描述。:
初始化FPGA内部的SPI接口中的slave select register,写入的值为不选择任何一个从设备。 2、XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR); 以下是该函数的定义
#define XSpi_Set_Enable(BaseAddress) \\ { \\
Xuint16 Control; \\
Control = XSpi_ReadReg(BaseAddress, XSP_CR_OFFSET); \\ Control |= XSP_CR_ENABLE_MASK; \\
XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, Control); \\ }
该函数代表重新初始化Control register,以使能FPGA内部的SPI接口可用即将控制寄存器CR中的SPE位置1。 3、do { //设置FLASH以使FLASH任何一部分都受保护protected
SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x7C);
首先分析SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); 该函数的定义为:
void SF_write_status_register (Xuint32 BaseAddress, Xuint8 data) {
Xuint8 op_code[2], bogus_data[2]; // 设置SPI Flash 的写使能
SF_write_enable(BaseAddress); //选中第一个设备使能 SPI_FLASH_CS_LOW();
// 写SPI FLASH的状态 寄存器 op_code[0] = WRSR; op_code[1] = data;
spi_transfer(BaseAddress, op_code, bogus_data, 2);
//关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH();
// 等待写寄存器/编程/擦除命令操作结束 poll_until_complete(BaseAddress); // 设置SPI Flash 的写不使能
SF_write_disable(BaseAddress); }
这个函数的功能主要是要将data的值写入到STATUS REGISTER …… 此处隐藏:2703字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




