历史上的今天
今天是:2025年03月23日(星期日)
2020年03月23日 | stm32驱动NOR Flash 之MX25L51245G(64MB)
2020-03-23 来源:eefocus
MX25L51245G 支持SPI的MODE0/MODE3,一般都选择mode3
#define FLASH_SECTOR_SIZE (4*1024)
#define FLASH_PAGE_SIZE 256
引脚定义
/*
* SPI1
* @SCK : PA5
* @MISO : PA6
* @MOSI : PA7
*
* @CS : PA0
*/
读写接口
static u8 SPI_Write(u8 byte)
{
u32 timeout = 0xFFFF;
while(!(SPI1->SR & SPI_I2S_FLAG_TXE))
{
if(--timeout == 0)
{
printf("TX timeout ! rn");
return 0;
}
}
SPI1->DR = byte;
timeout = 0xFFFF;
while(!(SPI1->SR & SPI_I2S_FLAG_RXNE))
if(--timeout == 0)
{
printf("RX timeout ! rn");
return 0;
}
return SPI1->DR;
}
static u8 SPI_Read(void)
{
return (SPI_Write(DUMMY_BYTE));
}
初始化函数
void SPI1_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PA.0 as Output push-pull, used as Chip select */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Deselect the FLASH: Chip Select high */
SPI_CS_Low();
/* SPI1 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; /* mode 3 */
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 NSS output for master mode */
//SPI_SSOutputCmd(SPI1, DISABLE);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
SPI_Write(0xFF); //start transport
}
等待忙
/*
* @return : none-zero idle, else busy
*/
static u8 SPI_WaitBusy(void)
{
u32 timeout = 0xFFFF;
while( SET==SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)) /* SPI_SR */
{
if(--timeout == 0)
return 1;
}
return 0;
}
Flash 等待WIP信号
#define FLASH_WIP_MASK (1 << 0)
/*
* @return : none-zero timeout
*/
static u8 FlashWait_Busy(void)
{
u8 FLASH_Status;
u32 retry=0;
FLASH_CS_Low();
/*
* bit 0: WIP (=1 busy, else free)
* bit 1: WEL (=1 write enable)
*/
SPI_Write(RDSD_CMD); /* read status register */
do{
FLASH_Status=SPI_Read();
if(retry++ > FLASH_BUSY_TIMEOUT)
return FLASH_Status;
}while((FLASH_Status & FLASH_WIP_MASK) == FLASH_WIP_MASK); /* fix : not bit 7 !!! */
//printf("status register : 0x%x rn", FLASH_Status);
SPI_CS_High();
return 0;
}
获取flash信息
static void FlashGet_Info(flashInfoTypedef * pFlashInfo)
{
// FlashWait_Busy();
FLASH_CS_Low();
SPI_Write(RDID_CMD);
pFlashInfo->ManufacturerID=SPI_Read();
pFlashInfo->DeviceID[0]=SPI_Read();
pFlashInfo->DeviceID[1]=SPI_Read();
SPI_CS_High();
}
static void FlashGet_ElectronicInfo(flashInfoTypedef * pFlashInfo)
{
FLASH_CS_Low();
SPI_Write(REMS_CMD);
SPI_Write(DUMMY_BYTE);
SPI_Write(DUMMY_BYTE);
SPI_Write(0x00); //manufacturer's ID first
pFlashInfo->ManufacturerID=SPI_Read();
pFlashInfo->DeviceID[0]=SPI_Read();
SPI_CS_High();
}
写使能
static void FlashWriteEnable(void)
{
FLASH_CS_Low();
SPI_Write(WREN_CMD);
SPI_CS_High();
}
spi flash初始化
void SpiFlash_Init(void)
{
flashInfoTypedef flashInfo;
//SPI1_Configuration();
#if 1
FlashGet_ElectronicInfo(&flashInfo);
if((flashInfo.ManufacturerID==0xc2)&&(flashInfo.DeviceID[0]==0x20))
{
printf("Flash Info: MXIC(Macronix International Co.,Ltdrn");
}
#endif
FlashGet_Info(&flashInfo);
printf("ManufacturerID = 0x%02X rn",flashInfo.ManufacturerID);
printf("DeviceID = 0x%02X%02X rn",flashInfo.DeviceID[0],flashInfo.DeviceID[1]);
}
获取ID的接口
static void Flash_ReadID(void)
{
flashInfoTypedef flashInfo;
FlashGet_ElectronicInfo(&flashInfo);
if((flashInfo.ManufacturerID==0xc2)&&(flashInfo.DeviceID[0]==0x20))
{
printf("Flash Info: MXIC(Macronix International Co.,Ltdrn");
}
FlashGet_Info(&flashInfo);
printf("ManufacturerID = 0x%02X rn",flashInfo.ManufacturerID);
printf("DeviceID = 0x%02X%02X rn",flashInfo.DeviceID[0],flashInfo.DeviceID[1]);
}
史海拾趣
|
语音识别芯片 声控芯片 LD3320 非特定人/单芯片/动态编辑识别列表 ICRoute 本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 看看大家能用这个芯片设计制造出什么样好玩又实用的新产品。 :) # 单芯片,非特定人,动态编辑识别列表的识别芯片LD332X系列,可以用于所有的电子产品,只需要最简单的51作为控制芯片即可 ...… 查看全部问答> |
|
公司(上海逻迅信息科技有限公司)现处于创业阶段,招3-4个人(全职),不限学历,能把事情做好即可,欢迎有能力、有学习热情者加入公司。 1、熟悉数字、模拟电路 2、熟练使用一款PCB设计软件 3、熟练使用电子测试仪器 4、优先考虑: 掌握一定 ...… 查看全部问答> |
|
交流输出单电容半桥式变压器开关电源(part1)开关电源原理与设计(连载36) 1-8-2-2.交流输出单电容半桥式变压器开关电源 图1-39是单电容半桥式变压器开关电源的工作原理图。这里的单电容是把图1-36中的上分压电容器C1或下分压电容器省掉了的意思,因此,图1-39的单电容半桥式变压器开关电源是相对于图1-36的双电容半桥式 ...… 查看全部问答> |
|
最近在研究430单片机控制lcd液晶显示的问题!可是对液晶控制器1335的资料却研究的不够透彻。关于分屏和每一屏地址的范围总是无法确定,导致图形字符重叠,或者显示不全!希望有高手能进来帮忙指点一下,或者给我留一个液晶开发的群号也可以,一起讨 ...… 查看全部问答> |
|
如題,看了《Programming the Microsoft Windows Driver Model》第一版,還不如直接編程硬件呢。 不知大家有什么好資料,十分感謝。… 查看全部问答> |
|
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册-RTC实时时钟实验(实验11) 开发板购买地址:http://shop62103354.taobao.com/… 查看全部问答> |
|
请问一下 我用uip 协议栈写LM3S8962以太网 怎么让数据连续往上位机发送呢 我现在只能上位机发送一次数据 下位机才向上发送一次数据 我想上位机发送一次命令 下位机能连续发送数据 等到我发停止命令 下位机才停止发送 这个程序在原来的基础上什么改 ...… 查看全部问答> |
|
MSP430程序升级方式探讨 作者、源出处未明,如知情者请通知我们;我们会及时更新。 对MSP430系列单片机进行编程的方式有以下三种:利用JTAG接口,利用BSL固件和利用用户自定义的升级固件。由于利用自定义升级固件进行程序升级的 ...… 查看全部问答> |




