历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2018年09月08日 | STM8L151 使用硬件SPI驱动W25Q16 Flash

2018-09-08 来源:eefocus

SPI:有四根线的串行通信协议,允许与其他设备以半、全双工、同步、串行方式通信。

MISO:主模式输入、从模式输出线

MOSI:主模式输出、从模式输入线

CLK:时钟线

NSS:从设备选择引脚,主设备标准IO驱动,并用来区分从设备

以STM8L 驱动SPI Flash W25Q16 为例说明记录下,使用STM8L 的SPI该注意哪些地方,以及如何简单驱动W25Q16。

华邦的W25Q16 SPI Flash芯片是采用SPI接口,至于该芯片的优缺点就不说了,STM8L上有一个硬件SPI,可以很方便的来驱动W25Q16,下面就来看看该如何配置STM8L的SPI 外设。

void SPI_FLASH_Init(void)

//SPI_CLOCK:PB5, SPI_MOSI: PB6, SPI_MISO: PB7

GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);

GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);

//主机模式,配置为输入 该设置很关键

GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);

  /* 初始化SPI */

SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_4, SPI_Mode_Master,\

SPI_CPOL_High, SPI_CPHA_2Edge, \

SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);

SPI_Cmd(SPI1, ENABLE); /* 使能SPI */

/* 配置CS管脚 */

GPIO_Init(SPI_CS , SPI_Pin_CS, GPIO_Mode_Out_PP_High_Fast);

GPIO_WriteBit(SPI_CS, SPI_Pin_CS, SET); /* 拉高不使能外部SPI设备 */

}

在上面中要注意SPI 使用到的管脚PB5, PB6, PB7 的设置,在SPI主机模式中,PB5、PB6根据外围电路可以设置为外部上拉输出,也可设置为上面的内部上拉输出,而PB7则要设置为内部上拉输入或浮空输入(外加上拉电阻),这些设置完还要开启SPI外设的时钟。

其中W25Q16的SPI总线模式是Mode0 或Mode3 ,这个在手册中或本文中下面的时序图中可以看出,那么对于SPI的初始化就要考虑了,当

SPI_Init中参数为SPI_CPOL_High, SPI_CPHA_2Edge表示Mode0,为SPI_CPOL_Low, SPI_CPHA_1Edge表示Mode3,如果为其他组合那么就会导致通信数据错位不正确。

下面是读取Flash 厂商ID和设备ID的函数,

uint8_t SPI_FLASH_SendByte(u8 byte)

{

  /* Loop while DR register in not emplty */

  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);

  /* Send byte through the SPI1 peripheral */

  SPI_SendData(SPI1, byte);

  /* Wait to receive a byte */

  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);

  /* Return the byte read from the SPI bus */

  return SPI_ReceiveData(SPI1);  

 }

uint16_t SPI_FLASH_ReadID(void)

{

u16 Device_ID = 0;

/* Select the FLASH: Chip Select low */

SPI_FLASH_CS_LOW(); //拉低片选管脚电平,选中外设

/* Send "RDID " instruction */

SPI_FLASH_SendByte(0x90); //读取设备ID指令

SPI_FLASH_SendByte(0X00);

SPI_FLASH_SendByte(0X00);

SPI_FLASH_SendByte(0X00);

/* Read a byte from the FLASH */

Device_ID = (SPI_FLASH_SendByte(Dummy_Byte)<<8);

Device_ID |= SPI_FLASH_SendByte(Dummy_Byte);

SPI_FLASH_CS_HIGH();//拉高片选管脚电平,

return Device_ID;

}

在W25Q16的手册中,

函数读回来的数据应该是上面的值,再看看手册上的ID读取指令0x90

获取设备ID的指令发送顺序如上图,第一字节先发0x90,然后发两个dummy Byte(任何数值都可)和0x00,之后再读取厂商ID和设备ID,上面的函数基本实现的就是这个时序。

实测的测试结果如下,


结果与手册给的ID一致。


推荐阅读

史海拾趣

CYMBET公司的发展小趣事

CYMBET公司成立于2000年,专注于微电子系统固态储能解决方案的研发与生产。在早期,公司就凭借其创新技术——可充电固态电池芯片(EnerChip)在行业中崭露头角。这种电池芯片使用标准半导体集成电路工艺和独特的构造技术,提供了环保、生物相容的嵌入式电源功能。EnerChip的推出不仅打破了传统电池的局限,还为医疗、传感器、RFID、工业控制等领域带来了革命性的变化。

Belkin公司的发展小趣事

贝尔金公司的业务始于1983年的美国加州霍桑。当时,它仅仅是一个在车库里运营的小企业,销售额仅为十八万美元。然而,这个看似不起眼的起点却孕育了一个未来的行业巨头。从最初的产品设计和生产,到逐步进入市场并获得消费者的认可,贝尔金凭借对电子产品连接技术的深入理解和创新,逐步在行业中崭露头角。

Harbour Industries公司的发展小趣事

背景:近年来,随着环保意识的提高和可持续发展理念的普及,电子行业也开始向绿色化、低碳化方向发展。Handok积极响应这一趋势,将绿色可持续发展作为公司的重要战略之一。

发展:Handok加大了对环保技术的研发投入,推出了一系列绿色电子产品和解决方案。同时,公司还优化了生产流程和管理体系,实现了资源的高效利用和废弃物的减量化处理。

影响:Handok的绿色可持续发展战略不仅赢得了市场的广泛认可,还为公司树立了良好的社会形象。此外,这一战略还有助于公司在未来更加激烈的市场竞争中保持领先地位。

CyOptics Inc公司的发展小趣事

在被Avago收购后,CyOptics并未停止其技术创新的步伐。公司继续投入研发,推出了一系列新的光学产品和解决方案,以满足不断增长的市场需求。例如,CyOptics的物理介质相关(PMD)IC产品系列,不仅提供了完整的GaAs芯片组件,还提供了跨阻放大器(TIA)、激光驱动器(LD)等一站式芯片套件解决方案,为客户提供了更加便捷和高效的服务。

Fine Products Microelectronics Corp公司的发展小趣事

2013年4月,Avago宣布以约4亿美元的价格收购CyOptics Inc。这一收购标志着CyOptics的技术实力和市场地位得到了业界的进一步认可。Avago看中了CyOptics在InP光学芯片及组件领域的领先地位,希望借此增强其在新兴40G和100G企业及数据中心应用市场中的竞争力。收购完成后,CyOptics成为了Avago旗下光器件品牌,继续为市场提供高质量的光学产品。

B&F Fastener Supply公司的发展小趣事

凭借优质的产品和服务,B&F Fastener Supply公司逐渐赢得了大型电子厂商的青睐。多家知名电子企业选择与B&F建立长期合作关系,将其作为紧固件和电子元器件的主要供应商。这不仅为B&F带来了稳定的订单和收入来源,还进一步提升了公司在电子行业的地位和影响力。

问答坊 | AI 解惑

晒板子28335

28335电力电子与电力传动专用控制板 …

查看全部问答>

1-wire系统中TM卡的单片机等效替换

1 TM卡简介   TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC 卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button) ...…

查看全部问答>

获取芯币的另一个小诀窍

快速获得芯币的另一种方法,就是与博客紧密结合。规则如下,请大家详细阅读啊! 1、注册博客 + 20 芯币 2、在论坛签名中注明自己博客地址  +5 芯币    3、博客个人信息注册完全,其中上传电子相片  +5芯币 4、 ...…

查看全部问答>

浙江大学RF设计(前端系统)(pdf)

第10个附件是一个超外差高频头的实例,很宝贵的资料…

查看全部问答>

LED行业竞争白热化,各大厂商拿什么取胜呢?打扰了。

LED行业竞争白热化,各大厂商拿什么取胜呢?打扰了。…

查看全部问答>

基于Win32 API函数和多线程技术的串行通信编程.pdf

基于Win32 API函数和多线程技术的串行通信编程.pdf…

查看全部问答>

u-boot 的 配置问题.(从NAND启动)

提示的是 bad crc or nand 在网上查了下,应该是env的问题!麻烦各位有经验的朋友,说一下具体怎么改! 我用的是mini2440,page size应该是2048的,但是u-boot启动输出的还是512~已经进行过CONFIG_了…

查看全部问答>

请教高手:如何在扫描输入完成后,光标自动跳到下一个TEXTBOX

我想让程序在扫描输入完成后,光标自动跳到下一个TEXTBOX 可是我在WINCE上捕捉不到扫描键,也不知道如何区分 输入 是由键盘上输入的还是扫描读入的 哪位高手知道的帮帮我,谢谢 啦 …

查看全部问答>

请问这几句汇编具体的意思是什么?

GBLS        MainEntry MainEntry        SETS        \"Main\"         IMPORT        $MainEntry MainEntry不是已经在第一行就已经定 ...…

查看全部问答>

引脚使用

一个引脚写成这样PA1/USART2_RTS/ADC_IN1/TIM5_CH2/TIM2_CH2是什么意思…

查看全部问答>