共2条
1/1 1 跳转至页
430,MM36SB020,FLASH 【求助】哪位大侠有430读写MM36SB020串行FLASH的简单例子,谢谢!我的代码总是不能正常读写。紧急求助。
问
【求助】哪位大侠有430读写MM36SB020串行FLASH的简单例子,谢谢!我的代码总是不能正常读写。紧急求助。
答 1:
#include "common.h"
#include "36sb020.h"
#define BUSY_PIN (1<<2)
#define SCLK (1<<3)
#define SDI (1<<4)
#define SDO (1<<5)
/* 定义命令 */
#define ERSC 0x90f6 /* 檫除整个芯片 */
#define SRC 0xfffffffe /* 软件复位芯片 */
#define RSE 0x94 /* 读状态寄存器 */
#define RBE 0x98 /* 读一个字节数据从缓冲区 */
#define RME 0x9c /* 读一个字节数据从Flash存储器 */
#define RMEC 0xa0 /* 连续读一字节数据从Flash存储器,先自动地址增加 */
#define RMB 0xa4 /* 读一页数据(128 byte),从Flash存储器到缓冲区 */
#define WEB 0xa8 /* 写一个字节数据到缓冲区 */
#define WEBC 0xac /* 连续写一个字节数据到缓冲区,先自动地址增加 */
#define WBMEP 0xb0 /* 写缓冲区数据到Flash存储器,先自动页檫除 */
#define WBME 0xb4 /* 写缓冲区数据到Flash存储器,没有自动页檫除 */
/* 定义常量 */
#define LOW 0
#define HIGH 1
/*
数据写入用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
WriteFlash(100,0, 128, buffer); // 写数据到 e-Flash 缓冲区
数据读取用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
ReadFlash(100,0,128,buffer);
}
*/
void Delay(unsigned int k)
{
unsigned int i,j;
for(j = 0; j<k; j++)
{
for(i=0;i<15;i++);
}
}
void ResetFlash()
{
WriteChar(0xfe);
WriteChar(0xff);
WriteChar(0xff);
WriteChar(0xff);
}
unsigned char ReadChar()
{
unsigned char i ,one_data;
for(i = 0; i < 8; i ++)
{
P2OUT=0;
Delay(2);
one_data = one_data >> 1;
P2OUT=SCLK ;
Delay(2);
if ((P2IN & SDO) == SDO)
{
one_data = one_data | 0x80;
}
}
return (one_data);
}
void WriteChar(unsigned char one_data)
{
unsigned char i ;
for(i = 0;i < 8;i ++)
{
P2OUT=0;
if ((one_data & 0x01)==0x01)
{
P2OUT = SDI;
Delay(2);
P2OUT = SDI + SCLK;
}
else
{
Delay(2);
P2OUT = SCLK;
}
Delay(2);
one_data = one_data >> 1;
}
}
void WriteInt(unsigned int one_data)
{
WriteChar(one_data&0xff);
WriteChar(one_data>>8);
}
unsigned char busy( ) /*读状态命令*/
{
if((P2IN & BUSY_PIN) == BUSY_PIN)
return 1;
else
return 0;
}
/* 读数据从缓冲区: */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadBuff(unsigned char begin_addr, unsigned char counter, unsigned char array[])
{
unsigned char i ;
if(busy()) return 0xff;
for(i = 0; i < counter; i ++) /* 连续读数据 */
{
WriteChar(RBE); /* 送 RBE 指令, 读一个字节数据从 Buffer */
WriteChar(begin_addr + i); /* 送页内地址 */
array[i] = ReadChar(); /* 读数据 */
}
return 0x0;
}
/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadFlash(unsigned int page_addr, unsigned char in_page_byte_addr, unsigned char counter, unsigned char array[])
{
while(busy());
FlashToBuff(page_addr); /* 送 RME 指令, 读一个字节数据从Flash存储器 */
while(busy());
ReadBuff(in_page_byte_addr,counter,array); /* 送页内地址 */
return 0x0;
}
/* 读一页数据到缓冲区,从flash存储器,page_addr为页地址 */
unsigned char FlashToBuff(unsigned int page_addr)
{
while(busy());
WriteChar(RMB); /* 送 RMB 指令, 读一页数据到缓冲区,从Flash存储器 */
WriteInt(page_addr); /* 送页地址 */
Delay(1000); /* MM36SB010, Max = 135 uS, without Rosc; MM36SB020, Max = 105 uS, with Rosc */
return 0x0;
}
/* 写数据到缓冲区 */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为写多少个数, send_array[]为MCU内部存储空间 */
unsigned char WriteBuff(unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
unsigned char i ;
while(busy());
WriteChar(WEB); /* 送 WEB 指令,写一个字节数据到缓冲区 */
WriteChar(begin_addr); /* 送缓冲区内首地址 */
WriteChar(send_array[0]); /* 送第一字节数据 */
for(i = 1;i < counter; i ++)
{
WriteChar(WEBC); /* 连续写一个字节数据到缓冲区,先自动地址增加 */
WriteChar(send_array[i]); /* 送第 i 字节数据 */
}
return 0x0;
}
/* 写数据到Flash存储器 */
/* page_addr为页地址, in_page_begin_addr为页内地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
unsigned char WriteFlash(unsigned int page, unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
while(busy());
FlashToBuff(page); /* 将整页数据读进缓冲区进行保护 */
WriteBuff(begin_addr, counter, send_array);
/* in_buffer_begin_addr = in_page_begin_addr, 在缓冲区中修改相应的数据 */
WriteChar(WBMEP); /* 送WBMEP指令, 写缓冲区数据到Flash存储器,先自动页檫除 */
WriteInt(page); /* 送页字节地址 */
Delay(1000);
return 0x0;
}
#include "36sb020.h"
#define BUSY_PIN (1<<2)
#define SCLK (1<<3)
#define SDI (1<<4)
#define SDO (1<<5)
/* 定义命令 */
#define ERSC 0x90f6 /* 檫除整个芯片 */
#define SRC 0xfffffffe /* 软件复位芯片 */
#define RSE 0x94 /* 读状态寄存器 */
#define RBE 0x98 /* 读一个字节数据从缓冲区 */
#define RME 0x9c /* 读一个字节数据从Flash存储器 */
#define RMEC 0xa0 /* 连续读一字节数据从Flash存储器,先自动地址增加 */
#define RMB 0xa4 /* 读一页数据(128 byte),从Flash存储器到缓冲区 */
#define WEB 0xa8 /* 写一个字节数据到缓冲区 */
#define WEBC 0xac /* 连续写一个字节数据到缓冲区,先自动地址增加 */
#define WBMEP 0xb0 /* 写缓冲区数据到Flash存储器,先自动页檫除 */
#define WBME 0xb4 /* 写缓冲区数据到Flash存储器,没有自动页檫除 */
/* 定义常量 */
#define LOW 0
#define HIGH 1
/*
数据写入用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
WriteFlash(100,0, 128, buffer); // 写数据到 e-Flash 缓冲区
数据读取用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
ReadFlash(100,0,128,buffer);
}
*/
void Delay(unsigned int k)
{
unsigned int i,j;
for(j = 0; j<k; j++)
{
for(i=0;i<15;i++);
}
}
void ResetFlash()
{
WriteChar(0xfe);
WriteChar(0xff);
WriteChar(0xff);
WriteChar(0xff);
}
unsigned char ReadChar()
{
unsigned char i ,one_data;
for(i = 0; i < 8; i ++)
{
P2OUT=0;
Delay(2);
one_data = one_data >> 1;
P2OUT=SCLK ;
Delay(2);
if ((P2IN & SDO) == SDO)
{
one_data = one_data | 0x80;
}
}
return (one_data);
}
void WriteChar(unsigned char one_data)
{
unsigned char i ;
for(i = 0;i < 8;i ++)
{
P2OUT=0;
if ((one_data & 0x01)==0x01)
{
P2OUT = SDI;
Delay(2);
P2OUT = SDI + SCLK;
}
else
{
Delay(2);
P2OUT = SCLK;
}
Delay(2);
one_data = one_data >> 1;
}
}
void WriteInt(unsigned int one_data)
{
WriteChar(one_data&0xff);
WriteChar(one_data>>8);
}
unsigned char busy( ) /*读状态命令*/
{
if((P2IN & BUSY_PIN) == BUSY_PIN)
return 1;
else
return 0;
}
/* 读数据从缓冲区: */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadBuff(unsigned char begin_addr, unsigned char counter, unsigned char array[])
{
unsigned char i ;
if(busy()) return 0xff;
for(i = 0; i < counter; i ++) /* 连续读数据 */
{
WriteChar(RBE); /* 送 RBE 指令, 读一个字节数据从 Buffer */
WriteChar(begin_addr + i); /* 送页内地址 */
array[i] = ReadChar(); /* 读数据 */
}
return 0x0;
}
/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadFlash(unsigned int page_addr, unsigned char in_page_byte_addr, unsigned char counter, unsigned char array[])
{
while(busy());
FlashToBuff(page_addr); /* 送 RME 指令, 读一个字节数据从Flash存储器 */
while(busy());
ReadBuff(in_page_byte_addr,counter,array); /* 送页内地址 */
return 0x0;
}
/* 读一页数据到缓冲区,从flash存储器,page_addr为页地址 */
unsigned char FlashToBuff(unsigned int page_addr)
{
while(busy());
WriteChar(RMB); /* 送 RMB 指令, 读一页数据到缓冲区,从Flash存储器 */
WriteInt(page_addr); /* 送页地址 */
Delay(1000); /* MM36SB010, Max = 135 uS, without Rosc; MM36SB020, Max = 105 uS, with Rosc */
return 0x0;
}
/* 写数据到缓冲区 */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为写多少个数, send_array[]为MCU内部存储空间 */
unsigned char WriteBuff(unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
unsigned char i ;
while(busy());
WriteChar(WEB); /* 送 WEB 指令,写一个字节数据到缓冲区 */
WriteChar(begin_addr); /* 送缓冲区内首地址 */
WriteChar(send_array[0]); /* 送第一字节数据 */
for(i = 1;i < counter; i ++)
{
WriteChar(WEBC); /* 连续写一个字节数据到缓冲区,先自动地址增加 */
WriteChar(send_array[i]); /* 送第 i 字节数据 */
}
return 0x0;
}
/* 写数据到Flash存储器 */
/* page_addr为页地址, in_page_begin_addr为页内地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
unsigned char WriteFlash(unsigned int page, unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
while(busy());
FlashToBuff(page); /* 将整页数据读进缓冲区进行保护 */
WriteBuff(begin_addr, counter, send_array);
/* in_buffer_begin_addr = in_page_begin_addr, 在缓冲区中修改相应的数据 */
WriteChar(WBMEP); /* 送WBMEP指令, 写缓冲区数据到Flash存储器,先自动页檫除 */
WriteInt(page); /* 送页字节地址 */
Delay(1000);
return 0x0;
}
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |