📄 sf.c
字号:
/************************************************** * * sf.c * * CVS ID: $Id: sf.c,v 1.7 2006/11/24 16:31:38 sedmik Exp $ * Author: Sangwon Bae [swbae] - Optomech * Date: $Date: 2006/11/24 16:31:38 $ * Revision: $Revision: 1.7 $ * * Description: * serial flash access via bspi * based on bspi.c * *************************************************** * * COPYRIGHT (C) ST Microelectronics 2005 * All Rights Reserved * *************************************************** * * STM CVS Log: * * $Log: sf.c,v $ * Revision 1.7 2006/11/24 16:31:38 sedmik * fix related to HAVE_TEMP_SENSOR define * * Revision 1.6 2006/10/31 11:15:16 marcucci * Modified to make HAVE_UPDATE working * * Revision 1.5 2006/09/18 09:55:23 belardi * Corrected CVS keyword usage * * Revision 1.4 2006/09/18 09:24:43 belardi * Added Log CVS keyword into file header * * ***************************************************/#include "gendef.h"#include "hwreg.h"#include "blgendef.h"#include "bspi_util.h"/****************************************************************** * * BSPI * *****************************************************************///JS disabled due to compilation errors !//#if (0 != HAVE_POSITION) || (0 != HAVE_UPDATE)void bspi_init(void){ GCR1.field.sdram_sel = 0; // BSPI is selected on the shared pad PDB |= 0x1; BSPI_CSR1.field.bspe = 0; // BSPI Disable BSPI_CLK = 32; BSPI_CSR1.field.mstr = 1; // BSPI is a master BSPI_CSR2.field.dfifo = 1; // Clear FIFO BSPI_CSR3.field.mask_ss = 1; // Mask SS BSPI_CSR1.field.cpol = 0; BSPI_CSR1.field.cpha = 0; BSPI_CSR1.field.rfs = 0; BSPI_CSR1.field.rie = 0; BSPI_CSR2.field.tfs = 0; BSPI_CSR1.field.bspe = 1; // BSPI Enable}void bspi_send(uint32 data){ while(1) { if(BSPI_CSR2.field.tfe) { BSPI_TXR = (data << 8); break; } }}uint8 bspi_read(uint32 data){ bspi_send(data); while(1) { if(BSPI_CSR2.field.rfne) { return (BSPI_RXR & 0xFF); } }}uint32 bspi_rdid(void){ uint32 i; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); bspi_read(0xAB); bspi_read(0x00); bspi_read(0x00); bspi_read(0x00); i = bspi_read(0x00); PDB |= 1; return i;}#if (0 != HAVE_POSITION) || (0 != HAVE_UPDATE)uint32 bspi_rdsr(void){ uint32 i; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); bspi_read(0x05); i = bspi_read(0x00); // 1st Dummy PDB |= 1; return i;}uint32 bspi_wren(void){ uint32 i; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); i = bspi_read(0x06); PDB |= 1; return i;}uint32 bspi_bulk_erase(void){ uint32 i; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); i = bspi_read(0xC7); PDB |= 1; return i;}uint32 bspi_sector_erase(uint32 addr){ uint32 i; uint32 byte_0; uint32 byte_1; uint32 byte_2; byte_0 = (addr & 0xFF); byte_1 = (addr & 0xFF00) >> 8; byte_2 = (addr & 0xFF0000) >> 16; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); bspi_read(0xD8); bspi_read(byte_2); bspi_read(byte_1); i = bspi_read(byte_0); PDB |= 1; return i;}void bspi_pp(uint32 page_addr, uint8* buf, uint32 byte_no){ volatile uint32 i; uint32 byte_0; uint32 byte_1; uint32 byte_2; byte_0 = (page_addr & 0xFF); byte_1 = (page_addr & 0xFF00) >> 8; byte_2 = (page_addr & 0xFF0000) >> 16; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); bspi_read(0x02); bspi_read(byte_2); bspi_read(byte_1); bspi_read(byte_0); for(i=0; i<10;i++); while(byte_no) { bspi_read((*buf) & 0xFF); buf ++; byte_no --; } PDB |= 1;}uint32 sf_erase(void){ uint32 sf_sr; bspi_wren(); sf_sr = bspi_rdsr(); if(sf_sr & 0x02) { bspi_bulk_erase(); return 1; } return 0;}#if (0 != HAVE_POSITION)uint32 sf_erase_sector(uint32 addr){ uint32 sf_sr; bspi_wren(); sf_sr = bspi_rdsr(); if(sf_sr & 0x02) { bspi_sector_erase(addr); return 1; } return 0;}#endif /* HAVE_POSITION */uint32 sf_busy(void){ uint32 sf_sr = bspi_rdsr(); return (sf_sr & 0x01) ? 1 : 0;}uint32 sf_pp(uint32 page_addr, uint8* buf, uint32 byte_no){ uint32 sf_sr; bspi_wren(); sf_sr = bspi_rdsr(); if(sf_sr & 0x02) { bspi_pp(page_addr, buf, byte_no); return 1; } return 0;}#endif /* HAVE_POSITION || HAVE_UPDATE */void sf_read(uint32 page_addr, uint8* buf, uint32 byte_no){ uint32 i; uint32 byte_0; uint32 byte_1; uint32 byte_2; byte_0 = (page_addr & 0xFF); byte_1 = (page_addr & 0xFF00) >> 8; byte_2 = (page_addr & 0xFF0000) >> 16; PDB &= 0xFFFFFFFE; for(i=0; i<100;i++); bspi_read(0x03); bspi_read(byte_2); bspi_read(byte_1); bspi_read(byte_0); for(i=0; i<10;i++); while(byte_no) { *buf ++ = bspi_read(0x00); byte_no --; } PDB |= 1;}//JS moved up by func above, due to compilation error!//#endif /* HAVE_POSITION || HAVE_UPDATE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -