FX3/CX3 M25P40存储器读写
来源:互联网 发布:澳门网络运营商有哪些 编辑:程序博客网 时间:2024/05/29 13:16
直接上代码:
cycx3_M25P40.h
/* * 保存imu数据到flash(M25P40)中 */#ifndef _INCLUDED_CYCX3_M25P40_H_#define _INCLUDED_CYCX3_M25P40_H_#include "cyu3types.h"#include "cyu3usbconst.h"#include "cyu3os.h"#include "cyu3utils.h"#include "cyu3mipicsi.h"#include "cyu3externcstart.h"#include "cyu3spi.h"//uint16_t glSpiPageSize = 0x100; /* SPI Page size to be used for transfers. */#define glSpiPageSize 0x100CyU3PReturnStatus_t CyFxSpiInit (uint16_t pageLen);CyU3PReturnStatus_t CyFxSpiWaitForStatus (void);CyU3PReturnStatus_t CyFxSpiTransfer ( uint16_t pageAddress, uint16_t byteCount, uint8_t *buffer, CyBool_t isRead);CyU3PReturnStatus_t //staticCyFxSpiEraseSector ( CyBool_t isErase, uint8_t sector, uint8_t *wip);#endif
cycx3_M25P40.c
#include "cyu3system.h"#include "cyu3os.h"#include "cyu3dma.h"#include "cyu3error.h"#include "cyu3i2c.h"#include "cyu3uart.h"#include "cyu3gpio.h"#include "cyu3utils.h"#include "cycx3_M25P40.h"/* SPI initialization for application. */CyU3PReturnStatus_tCyFxSpiInit (uint16_t pageLen){ CyU3PSpiConfig_t spiConfig; CyU3PReturnStatus_t status = CY_U3P_SUCCESS; /* Start the SPI module and configure the master. */ status = CyU3PSpiInit(); if (status != CY_U3P_SUCCESS) { return status; } /* Start the SPI master block. Run the SPI clock at 8MHz * and configure the word length to 8 bits. Also configure * the slave select using FW. */ CyU3PMemSet ((uint8_t *)&spiConfig, 0, sizeof(spiConfig)); spiConfig.isLsbFirst = CyFalse; spiConfig.cpol = CyTrue; spiConfig.ssnPol = CyFalse; spiConfig.cpha = CyTrue; spiConfig.leadTime = CY_U3P_SPI_SSN_LAG_LEAD_HALF_CLK; spiConfig.lagTime = CY_U3P_SPI_SSN_LAG_LEAD_HALF_CLK; spiConfig.ssnCtrl = CY_U3P_SPI_SSN_CTRL_FW; spiConfig.clock = 8000000; spiConfig.wordLen = 8; status = CyU3PSpiSetConfig (&spiConfig, NULL); return status;}/* Wait for the status response from the SPI flash. */CyU3PReturnStatus_tCyFxSpiWaitForStatus ( void){ uint8_t buf[2], rd_buf[2]; CyU3PReturnStatus_t status = CY_U3P_SUCCESS; //uint8_t cnt = 0; /* Wait for status response from SPI flash device. */ do { buf[0] = 0x06; /* Write enable command. */ CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (buf, 1); CyU3PSpiSetSsnLine (CyTrue); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "SPI WR_ENABLE command failed\n\r"); return status; } buf[0] = 0x05; /* Read status command */ CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (buf, 1); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "SPI READ_STATUS command failed\n\r"); CyU3PSpiSetSsnLine (CyTrue); return status; } status = CyU3PSpiReceiveWords (rd_buf, 2); CyU3PSpiSetSsnLine (CyTrue); if(status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "SPI status read failed\n\r"); return status; } // CyU3PDebugPrint (2, "CyFxSpiWaitForStatus(),cnt = %d\n\r",++cnt); } while ((rd_buf[0] & 1)|| (!(rd_buf[0] & 0x2))); return CY_U3P_SUCCESS;}/* SPI read / write for programmer application. */CyU3PReturnStatus_tCyFxSpiTransfer ( uint16_t pageAddress, uint16_t byteCount, uint8_t *buffer, CyBool_t isRead){ uint8_t location[4]; uint32_t byteAddress = 0; uint16_t pageCount = (byteCount / glSpiPageSize); CyU3PReturnStatus_t status = CY_U3P_SUCCESS; if (byteCount == 0) { return CY_U3P_SUCCESS; } if ((byteCount % glSpiPageSize) != 0) { pageCount ++; } byteAddress = pageAddress * glSpiPageSize; CyU3PDebugPrint (2, "SPI access - addr: 0x%x, size: 0x%x, pages: 0x%x.\r\n", byteAddress, byteCount, pageCount); while (pageCount != 0) { location[1] = (byteAddress >> 16) & 0xFF; /* MS byte */ location[2] = (byteAddress >> 8) & 0xFF; location[3] = byteAddress & 0xFF; /* LS byte */ if (isRead) { location[0] = 0x03; /* Read command. */ status = CyFxSpiWaitForStatus (); if (status != CY_U3P_SUCCESS) return status; CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (location, 4); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "SPI READ command failed\r\n"); CyU3PSpiSetSsnLine (CyTrue); return status; } status = CyU3PSpiReceiveWords (buffer, glSpiPageSize); if (status != CY_U3P_SUCCESS) { CyU3PSpiSetSsnLine (CyTrue); CyU3PDebugPrint (2, "Read: CyU3PSpiReceiveWords err,status =0x%x.\r\n",status); return status; } CyU3PSpiSetSsnLine (CyTrue); } else /* Write */ { location[0] = 0x02; /* Write command */ status = CyFxSpiWaitForStatus (); if (status != CY_U3P_SUCCESS) return status; CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (location, 4); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "SPI WRITE command failed\r\n"); CyU3PSpiSetSsnLine (CyTrue); return status; } status = CyU3PSpiTransmitWords (buffer, glSpiPageSize); if (status != CY_U3P_SUCCESS) { CyU3PSpiSetSsnLine (CyTrue); return status; } CyU3PSpiSetSsnLine (CyTrue); } /* Update the parameters */ byteAddress += glSpiPageSize; buffer += glSpiPageSize; pageCount --; CyU3PThreadSleep (10); } return CY_U3P_SUCCESS;}/* Function to erase SPI flash sectors. */CyU3PReturnStatus_tCyFxSpiEraseSector ( CyBool_t isErase, uint8_t sector, uint8_t *wip){ uint32_t temp = 0; uint8_t location[4], rdBuf[2]; CyU3PReturnStatus_t status = CY_U3P_SUCCESS; if ((!isErase) && (wip == NULL)) { return CY_U3P_ERROR_BAD_ARGUMENT; } location[0] = 0x06; /* Write enable. */ CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (location, 1); CyU3PSpiSetSsnLine (CyTrue); if (status != CY_U3P_SUCCESS) return status; if (isErase) { location[0] = 0xD8; /* Sector erase. */ temp = sector * 0x10000; location[1] = (temp >> 16) & 0xFF; location[2] = (temp >> 8) & 0xFF; location[3] = temp & 0xFF; CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (location, 4); CyU3PSpiSetSsnLine (CyTrue); } else { location[0] = 0x05; /* Read status */ CyU3PSpiSetSsnLine (CyFalse); status = CyU3PSpiTransmitWords (location, 1); if (status != CY_U3P_SUCCESS) { CyU3PSpiSetSsnLine (CyTrue); return status; } status = CyU3PSpiReceiveWords (rdBuf, 2); CyU3PSpiSetSsnLine (CyTrue); *wip = rdBuf[0] & 0x1; } return status;}
测试代码:
#define TEST_FLASH#ifdef TEST_FLASH //test flash rw. #define len 270 //270 err 255 ok uint16_t i = 0; uint8_t buf_wr[len] = {0},buf_WIP[10]={0x01},buf_rd[len] = {0}; for(i=0;i<len;i++){ buf_wr[i] = i; } buf_wr[len-4] = 0x11;buf_wr[len-3] = 0x22;buf_wr[len-2] = 0x33;buf_wr[len-1] = 0x44; const uint8_t Sector_Num = 7; status = CyFxSpiEraseSector(CyTrue,Sector_Num,buf_WIP); if(status != CY_U3P_SUCCESS){ CyU3PDebugPrint (4, "Erase Error: %x\r\n",status); } do{//wait until wip is 0 CyU3PThreadSleep (50); CyFxSpiEraseSector(CyFalse,Sector_Num,buf_WIP); CyU3PDebugPrint (4, "111 RDSR: %x\r\n",buf_WIP[0]);//3 }while((buf_WIP[0] & 0x01) == 1); status = CyFxSpiTransfer (Sector_Num*glSpiPageSize, len,buf_wr, CyFalse);//write if(status != CY_U3P_SUCCESS){ CyU3PDebugPrint (4, "Write Error: %x\r\n",status); }//*/ do{//wait until wip is 0 CyU3PThreadSleep (50); CyFxSpiEraseSector(CyFalse,Sector_Num,buf_WIP); CyU3PDebugPrint (4, "111 RDSR: %x\r\n",buf_WIP[0]);//3 }while((buf_WIP[0] & 0x01) == 1); status = CyFxSpiTransfer (Sector_Num*glSpiPageSize, len,buf_rd, CyTrue);//read if(status != CY_U3P_SUCCESS){ CyU3PDebugPrint (4, "\r\nRead Error: %x\r\n",status); } CyU3PDebugPrint (4, "\r\nReadPage:%d,data:%x %x %x %x %x %x %x %x %x %x\r\n", Sector_Num*glSpiPageSize, buf_rd[len-4], buf_rd[len-3], buf_rd[len-2], buf_rd[len-1],buf_rd[4], buf_rd[5], buf_rd[6], buf_rd[7], buf_rd[8], buf_rd[9]);#endif
阅读全文
0 0
- FX3/CX3 M25P40存储器读写
- FX3/CX3 简介
- FX3/CX3 SPI
- FX3/CX3 Thread创建
- FX3/CX3 事件机制
- FX3/CX3 定时器
- FX3/CX3 timestamp
- FX3/CX3 延时
- FX3/CX3 flash
- FX3/CX3 JLINK 调试
- FX3/CX3 jtag debug
- FX3/CX3 CyU3PMutex
- FX3/CX3 DMA Overview
- FX3/CX3 I2C error
- FX3/CX3 模拟i2c
- FX3/CX3 elf转为img文件
- FX3/CX3 REQ_VENDOR自定义usb命令
- FX3/CX3 yuv/rgb输出修改
- linux 下安装 php kafka 扩展
- 服务器返回的参数里带了_如何处理
- dom节点的尺寸属性
- python源文件 将文件中所有除保留字外的小写字母换成大写字母
- html常见标签大全
- FX3/CX3 M25P40存储器读写
- Matlab篇----常用的回归分析Matlab命令(regress篇)
- Ray Tracing From The Ground Up--Kevin Suffern--光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011 英文原版+中文译版pdf
- ssm 一对多的映射关系
- linux svn 版本回滚
- 关于Qt控件坐标计算和mouseMoveEvent不响应的问题
- java23种设计模式十四(连载)
- jsp指令标记,动作标记,内置对象
- 大数据项目相关技术栈(Hadoop周边技术)