SPI - flash代码分析(2)
spi_transfer(BaseAddress, &op_code, &bogus_data, 1); //关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH(); }
首先该函数选中第一个从设备也就是我们这个FLASH。
接下来我们分析函数spi_transfer(BaseAddress, &op_code, &bogus_data, 1); 该函数的定义为:
void spi_transfer (Xuint32 BaseAddress, Xuint8 *send, Xuint8 *recv, Xuint8 num_bytes) {
Xuint8 NumBytesRcvd = 0; Xuint8 NumBytesSent = 0;
// 把发送的数据写入到SPI控制器的发送FIFO中 while(num_bytes--) {
XSpi_WriteReg(BaseAddress, XSP_DTR_OFFSET, *send++); NumBytesSent++; }
// 设置SPICR寄存器,使能Master Transactions XSpi_Clear_Inhibit(BaseAddress); // 等待发送FIFO为空
while (!(XSpi_ReadReg(BaseAddress, XSP_SR_OFFSET) & XSP_SR_TX_EMPTY_MASK)); // 从接收FIFO中接收数据
while ((XSpi_ReadReg(BaseAddress, XSP_SR_OFFSET) & XSP_SR_RX_EMPTY_MASK) == 0) {
*recv++ = XSpi_ReadReg(BaseAddress,XSP_DRR_OFFSET); NumBytesRcvd++; }
// 设置SPICR寄存器,Master Transactions 不使能 XSpi_Set_Inhibit(BaseAddress);
/*如果没有数据发送或发送的数据不等于接收的数据,则显示错误
* If no data was sent or the data that was sent was not received, * then return an error */
if ((NumBytesSent != NumBytesRcvd) || (NumBytesSent == 0)) {
print(\); } }
首先这个函数先将FPGA内部的SPI接口要传输的数据写入到FIFO中去, 然后设置Control register控制寄存器,以清楚禁止master传输位以使SPI接口能够传输数据。接下来就是开始传输数据了,确切的说是交换数据。 然后开始循环查询FPGA内部的SPI接口的Status register查看发送FIFO中的数据是否为空,假如为空则发送完毕,假如没有为空,则继续发送数据。
接下来就是读取接收FIFO中的数据,查询Status register看接收FIFO是否为空,不为空则读取数据,直到接收FIFO中的数据为空。这样就把数据传输完毕。
紧接着设置Control register寄存器以使传输禁止即Master Transactions 不使能。 检查接收的数据和发送的数据是否数量相等,相等则为正常,不相等则为错误。
我们再返回到函数void SF_write_enable (Xuint32 BaseAddress)
{
Xuint8 op_code = WREN, bogus_data; //选中第一个设备使能。 SPI_FLASH_CS_LOW(); // 发送写使能命令
spi_transfer(BaseAddress, &op_code, &bogus_data, 1); //关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH(); }
// 发送写使能命令
spi_transfer(BaseAddress, &op_code, &bogus_data, 1); 这句话就代表给FLASH设备一个WREN指令,允许写指令。 SPI_FLASH_CS_HIGH();
代表关闭选中设备以使任何一个设备都处于没有选中状态。
我们再返回到函数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); }
SF_write_enable(BaseAddress);这句话整体代表向FLASH传输一条WREN指令,以使FLASH做好写操作准备。
SPI_FLASH_CS_LOW();代表选中第一个设备
spi_transfer(BaseAddress, op_code, bogus_data, 2);这句话代表传输两个数据,第一个字节为命令WRSR,第二个字节为要写入的数据。
SPI_FLASH_CS_HIGH();代表关闭选中设备以使任何一个设备都没有选中 poll_until_complete(BaseAddress);该函数的定义为 void poll_until_complete (Xuint32 BaseAddress) {
Xuint8 status_reg, op_code; op_code = RDSR; …… 此处隐藏:611字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




