stm8教程实验16-spi总线 w25x16

合集下载

STM8教程实验16-SPI总线+W25X16

STM8教程实验16-SPI总线+W25X16

例程十六SPI_Flash的读写在这个例程中我们将要了解一下SPI,SPI也是跟I2C一样也是有硬件来实现的。

SPI一般有4根线,一条时钟线CLK,2条数据线(MISO和MOSI),1条片选信号线。

如果大家想了解更多关于SPI的话,大家可以参考“STM8寄存器.pdf”文档。

里面有更详细的解释以说明。

我们平时多用到的是SPI主模式,跟I2C一样。

下面讲一下SPI主模式一些关于常见初始化和配置的知识都讲了,下面我们从主函数看起,逐步分析:SPI_FLASH_Init() SPI的初始化看看函数原型:SPI_Init()配置了数据位高位先发送,SPI 的传输的波特率为系统频率的2分频,SPI为工作在主模式,当SPI处于空闲状态时时钟线处于高电平,数据在第二个时钟传输周期被锁,数据线为全双工,使用软件方式代替使用NSS管脚,使用CRC校验。

SPI_Cmd()时能SPI设置片选信号线,先把它置高。

初始化弄好了,下面来看看怎样往从设备读写,首先是读写一个字节。

我们开发板上的从设备上W25X16的,所以我们要根据W25X16的Datasheet来配置一下参数。

这个函数就是在SPI总线上读写一个字节的操作,是根据SPI总线的时序来完成的。

可以参考数据传输过程那里的说明。

这个函数就是往W25X16的写数据的写使能,参考一下的时序准备写一个数据,参考时序往W25X16的一页写数据,每页做多能写4102Byte。

这个函数是往任何地址写任何多个Byte的数据,直到写满为止,最大2Mbyte。

这个函数是往任何地址读任何个字节的数据缓存在pBuffer中。

读W25X16的ID号,参考时序擦除一个Block的数据,参考时序:擦除整个Flash,参考时序主要的功能函数模块都讲完了,还有一些测试时候写的测试其他的函数,有兴趣的可以看下工程。

实验效果:风驰电子祝您学习愉快~~~!!!!!。

小菲教你STM8单片机基础入门

小菲教你STM8单片机基础入门
STM8S主要特点:
速度达20 MIPS的高性能内核 抗干扰能力强,品质安全可靠 领先的130纳米制造工艺,优异的性价比 程序空间从4K到128K, 芯片选择从20脚到80脚,宽范围产品系列 系统成本低,内嵌EEPROM和高精度RC振荡器 开发容易,拥有本地化工具支持
STM8S主要应用:
STM8L主要特点:
STM8 16 MHz CPU 内置 4-32 KB 闪存,多达 2KB SRAM 三个系列:跨系列的引脚对引脚兼容、软件相互兼容、外设相互兼容 电源电压:1.8 V-3.6 V (断电时,最低 1.65 V) 超低功耗模式:保持 SRAM 内容时,最低功耗 350nA 运行模式动态功耗低至 150μA/MHz 最先进的数字和模拟外设接口 工作温度范围:-40°C 到+85 °C,可高达 125 °C 免费的触感固件库
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-7-
1.3 STM8A 系列
意法半导体公司推出的 STM8A 是一款专门用于满足汽车应用的特殊需求的 8-位 Flash 微控制器。这些模块化产品提供了真数据 EEPROM 以及软件和引脚兼容性,适用的程序存 储器尺寸范围为 8KB 至 256KB 和 20 至 128-引脚封装。所有器件的工作电压均为 3V 至 5V, 并且其工作温度扩展到了 145°C。
监控、紧急求助
王志杰 Email: iewangzhijie@ QQ:411238869
1 STM8 微控制器简介
-4-
STM8S 产品分为“Access Line(入门级)”和“Peroformance Line(增强型)”,如 下图所示。
王志杰 Email: iewangzhijie@ QQ:411238869

stm8l05xx,stm8l15xx和stm8l16xx中文参考手册(完整版)资料

stm8l05xx,stm8l15xx和stm8l16xx中文参考手册(完整版)资料

本参考手册的目标应用程序开发人员。

它提供了完整的信息如何使用stm8l05xx,stm8l15xx 和stm8l16xx微控制器的存储器和外围设备。

该stm8l05xx / stm8l15xx / stm8l16xx是一个家庭的不同存储密度的微控制器和外围设备。

这些产品是专为超低功耗应用。

可用的外设的完整列表,请参阅产品数据表。

订购信息,引脚说明,机械和电气设备的特点,请参阅产品数据表。

关于STM8 SWIM通信协议信息和调试模块,请参阅用户手册(um0470)。

在STM8的核心信息,请参阅STM8的CPU编程手册(pm0044)。

关于编程,擦除和保护的内部快闪记忆体,请参阅STM8L闪存编程手册(pm0054)。

1 中央处理单元(CPU)。

30。

1.1 引言301.2 CPU的寄存器。

30。

1.2.1 描述CPU寄存器。

..。

301.2.2 STM8 CPU寄存器图。

..。

341.3 全球配置寄存器(cfg_gcr)。

34。

1.3.1 激活水平。

..。

341.3.2 游泳禁用。

..。

351.3.3 描述全局配置寄存器(cfg_gcr)。

..。

35 1.3.4 全局配置寄存器图及复位值。

..。

352 启动ROM . . . 363程序存储器和数据存储器。

37。

3.1引言373.2术语。

37。

3.3个主要的快闪存储器的特点。

38。

3.4记忆的组织。

39。

3.4.1低密度设备的存储器组织。

393.4.2介质密度的装置记忆的组织。

..。

403.4.3介质+密度装置记忆的组织。

..。

413.4.4高密度存储器组织。

..。

423.4.5专有代码区(译)。

433.4.6用户区(UBC)。

433.4.7数据的EEPROM(数据)。

..。

463.4.8主程序区。

463.4.9选项字节。

..。

463.5内存保护。

47。

3.5.1读出保护。

473.5.2内存访问安全系统(质量)。

473.5.3使写访问选项字节。

493.6内存编程493.6.1同时读写(读写网)。

16位单片机实验指导书

16位单片机实验指导书

16位单片机应用实验指导书电子与信息工程学院2O15年2月实验一MC9S12XS128入门实验一.实验目的1.熟悉CodeWarrior嵌入式开发系统软硬件环境,掌握其使用方法及调试方式。

2.掌握S12 GPIO接口的使用方法及编程方法。

3.熟悉S12单片机的C语言程序编程框架。

4.理解样例中的第一个C语言程序代码。

二.实验设备及其连接1.PC机一台2.S12嵌入式开发实验板一套3.接线原理图实验板上有8个发光二级管和4个按钮开关, 8个发光二级管由单片机的PB口8个IO引脚控制, PB0-PB7输出低电平时LED点亮, 输出高电平时LED熄灭。

4个独立的按键输入直接连接到PP口的PP4-PP7引脚, 常态下为高电平, 按键按下时, CPU相应I/O引脚将检测到低电平, XS128芯片的PP口是有中断功能的IO口, 除了可用查询方式检测IO口的状态以外,我们也可以用中断的方式读入按键的状态。

三.实验内容1.使用CodeWarrior嵌入式开发系统的软硬件环境,掌握其使用方法及调试方式。

2.调试运行提供的样例程序light,观看实验结果。

(软件使用参见第四部分)3.运行样例程序,观察小灯的闪烁和对应的程序实现;调整延时的长短,继续观察小灯的闪烁。

4.尝试新建自己的工程,自编程序,实现用4个开关控制4个小灯的亮灭. 4个开关分别接在端口P的PTP4~PTP7口,4个小灯则接在PORTB0~PORTB3口, 参见第二部分连接图. 编程实现用这4个开关控制4个小灯,按钮开关按下时,对应小灯亮,否则为暗。

提示:新建工程时芯片选择HCS12X family-〉mc9s12xs128,connection 选择TBDML,然后下一步输入工程路径和名称,再3次下一步,选择默认选项,然后下一步、完成。

在main.c 文件中加入你的代码,主要通过设置数据方向寄存器DDRB DDRP和数据寄存器PORTB PTP来实现开关控制小灯的功能。

STM8开发板原理图

STM8开发板原理图

D1 LED1
D2 LED2
按键3
C14 GND 104
第四版原理图
PC3 OSI J1 4 3 2 1 VDD SWIM GND RST C2 22 16M Y1 GND C3 22 OSO
PC4
PD2
B
仿真器接口
SWIM
HSE
LED
KEY
FLASH
B
J2 VDD R1 1032 NRST J4 C4 104 GND VDD S4 3 2 1 CON3 5VIN
PD7/TLI/T1_C4 PD6/UART1_RX PD5/UART1_TX PD4/BEEP/T2_C1 PD3/T2_C2/ADC_ETR PD2/T2_C3 PD1/SWIM PD0/_T1_BKIN PC7/SPI_MISO PC6/SPI_MOSI PC5/SPI_SCK PC4/T1_C4/CCO PC3/T1_C3 PC2/T1_C2 PC1/T1_C1/UART1_CK PE5/SPI_NSS
跳线
C10 104 GND
MINIUSB接口 XI Y2 XO
电源选择跳线
蜂鸣器
LS1
VDD
R3 103
多用途液晶接口
光敏电阻
Q1 PNP
OLED直接插/段码液晶电路板上靠右侧插
GND Title
D
双跳线
USB转TTL
1 2 3
蜂鸣器
4
ADC
5
B Date: File:
32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17
PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PE5

W25Q16BV操作程序

W25Q16BV操作程序

如题,用菜农老师的助学板写的。

以前俺都习惯用模拟的SPI去解决问题,用这个板子试了下自带的SPI 控制器。

板子上是用W25Q16BV这款SPI接口的FLASH,这块片子是华邦出的,去DataSheet网上找居然没有,后来去华邦的官网下载了。

他由8192个可编程的页组成,每页有256bytes。

一次可写256bytes,可以sector、BLOCK、whole chip擦除。

具体擦除的指令可以参照其Datasheet,我就不说了。

下面附上程序,整个工程见附件:/*---------------------------------------------------------------------------------------------------------*//* *//* Copyrightp; *//*---------------------------------------------------------------------------------------------------------*//******************************************************************************文件名:W25Q16BV_Function.c说明:本文件为“NUC120RE3AN用SPI总线主机模式读写W25Q16BV的主函数。

UART的波特率为115200。

申明:本程序参考三心的spi程序和板子自带的BSP例程,运用中断模式。

谢谢。

开始:2011.8.23修改:V1.0******************************************************************************/#include <stdio.h>#include "NUC1xx.h"#include "DrvUART.h"#include "DrvSYS.h"#include "DrvSPI.h"#include "global.h"int main(){SYSTEM_Config();UART_Config();GPIO_Config();W25Q16BV_SPI_Init();printf("\n\n");printf("+----------------------------------------------------------------------+\n");printf("| 菜农老师助学板之SPI操作W25Q16BV |\n");printf("| |\n");printf("+----------------------------------------------------------------------+\n");printf("\n");printf("配置SPI1为主机模式.\n");printf("SPI1 时钟为: %d Hz\n", DrvSPI_GetClock1Freq(eDRVSPI_PORT1));while(1){if(SPI_Start_Flag==TRUE){SPI_Start_Flag=FALSE;printf("开始操作SPI\n");switch(UART_Buffer_Rx){case 'R':case 'r':printf("Read data from W25Q16BV ...\n");W25Q16BV_SPI_ReadFlash();break;case 'W':case 'w':printf("Write data to W25Q16BV ...\n");DrvSYS_Delay(1000);W25Q16BV_SPI_PageProgram();printf("Write Flash Over!\n");break;default:printf("您输入的指令有误!\n");}}}}#include <stdio.h>#include "NUC1xx.h"#include "DrvUART.h"#include "DrvSYS.h"#include "DrvSPI.h"#include "DrvGPIO.h"#include "Drive_Function.h"#define Enable_SPI1_W25Q16BV DrvGPIO_ClrBit(E_GPA, 14)#define Disable_SPI1_W25Q16BV DrvGPIO_SetBit(E_GPA, 14)//extern uint32_t SPI_TX_DATA_Buffer[256];//extern uint32_t SPI_RX_DATA_Buffer[256];extern uint32_t SPI_RX_DATA;extern uint32_t Write_Enable;extern uint32_t Write_Disable;extern uint32_t Read_Status_Register1;extern uint32_t Read_DATA;extern uint32_t Page_Program;extern uint32_t Sector_Erase;extern uint32_t Chip_Erase;extern uint32_t Read_ID;extern uint32_t Addr;extern uint8_t SPI_DATA_Buffer[256];extern volatile uint8_t count;extern volatile uint32_t g_Spi1IntFlag;extern volatile uint8_t W25Q16BV_BUSY_Flag;extern uint32_t u32Tmp;void W25Q16BV_SPI_Init(){/*开SPI1总线设置为主机模式,波形1*/DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32,FALSE);/*设置为MSP优先传输MSB*/DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);/*从机选择线低电平或者下降沿激活*/DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);/*SPI总线的速率设置为1MHZ*/DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1000000, 0);/*使能W25Q16BV 的片选信号*/Enable_SPI1_W25Q16BV;/*开启SPI1总线中断,并且与回调函数SPI1_Callback挂钩*/ DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 1);}void W25Q16BV_SPI_PageProgram(){uint16_t i;uint32_t au32SourceData;/*使能SPI1中断,且SPI1_Callback为其回调函数*/DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*中断标志清0*/g_Spi1IntFlag=0;/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/* Set the bit length of SPI transfer. */DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*写使能*/au32SourceData=0x06;printf("发送写能W25Q16BV\n");DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写能W25Q16BV指令发送完毕\n");/*关闭CS*/Disable_SPI1_W25Q16BV;/*打开CS*/Enable_SPI1_W25Q16BV;printf("Page_Program指令开始发送\n");au32SourceData=0x02;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;DrvSPI_SetBitLength(eDRVSPI_PORT1,24);au32SourceData=0x0000;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("Page_Program指令已经发送完毕\n");DrvSPI_SetBitLength(eDRVSPI_PORT1,8);for(i=0;i<256;i++){SPI_DATA_Buffer[i]=0x02;au32SourceData=SPI_DATA_Buffer[i];DrvSPI_SingleWrite(eDRVSPI_PORT1,&au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写入的值为: %d\n", SPI_DATA_Buffer[i]);}Disable_SPI1_W25Q16BV;}void W25Q16BV_SPI_ReadFlash(){uint32_t au32SourceData;uint16_t i;/*中断标志清0*/g_Spi1IntFlag=0;/*使能SPI1中断,且SPI1_Callback为其回调函数*/ DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*设置传输的长度*/DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/*读操作指令*/au32SourceData=0X03;/*写入指令*/DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/printf("开始写读命令字和地址\n");while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写完读命令字和地址\n");/*设置传送长度为24位*/DrvSPI_SetBitLength(eDRVSPI_PORT1,24);/*传送地址*/au32SourceData=0X0000;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;DrvSPI_SetBitLength(eDRVSPI_PORT1,8);for(i =0; i<256; i++){au32SourceData=0x0;/*开始接收数据*/DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); /*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;/*读取收到的数据*,并且不触发下一次传送*/DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &SPI_RX_DATA, 1);/*打印收到的数据*/SPI_DATA_Buffer[i]=(uint8_t)SPI_RX_DATA;printf("0x%X ",SPI_DATA_Buffer[i]);if ((i%10)==6)printf("\n");}printf("所有数据接收完毕\n");Disable_SPI1_W25Q16BV;}void W25Q16BV_SPI_ChipErase(){/*使能SPI1中断,且SPI1_Callback为其回调函数*/DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*中断标志清0*/g_Spi1IntFlag=0;/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/* Set the bit length of SPI transfer. */DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/* write the first data of source buffer to Tx register of SPI0. And start transmission. */ DrvSPI_SingleWrite(eDRVSPI_PORT1, &Write_Enable);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;/*关闭CS*/Disable_SPI1_W25Q16BV;DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*打开CS*/Enable_SPI1_W25Q16BV;DrvSPI_SingleWrite(eDRVSPI_PORT1, &Chip_Erase);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;Disable_SPI1_W25Q16BV;}void SPI1_Callback(uint32_t u32UserData) {g_Spi1IntFlag = 1;}。

w25q16数据手册_引脚图_参数

w25q16数据手册_引脚图_参数

8.
QUAD ENABLE (QE) – VOLATILE/NON-VOLATILE WRITABLE .............................................. 14
Write Protect Selection (WPS) – Volatile/Non-Volatile Writable ........................................15
4.3 Write Protect (/WP)............................................................................................................... 7
4.4 HOLD (/HOLD) ..................................................................................................................... 7
6.1 Standard SPI Instructions..................................................................................................... 9
6.2 Dual SPI Instructions ............................................................................................................ 9
Write Enable Latch (WEL) – Status Only...........................................................................11

W25X16中文手册

W25X16中文手册


W25X16,W25X32,W25X64
描封
脚类IC 态0时m除l
PDIP 总00m除l
PAD封N类
PAD封NAM状
1
/CS
I
2
DO
O
3
/WP
I
4
GND
5
DIO
I/O
6
CLK
I
7
/HOLD
I
8
VCC
擦封脚类IC 总00m除l
W脚类N 描×指MM
I/类
F芯NCTI类N
/
时封脚类IC 总00m除l
9Fh
ID
ID
DO
DIO CLK

ID ID
ID 8
email:richgood@
17
W25X16\W25X32\W25X64
Cortex-M0

JEDEC ID
ID Manufa部turer an释 Dev除部e I释ent除f除部at除on
ration
PAD封N类 1 2
W25X16,W25X32,W25X64
PAD封NAM状
I/类
/HOLD
I
VCC
email:richgood@
3
F芯NCTI类N
W25X16\W25X32\W25X64
Cortex-M0
3
N/C
4
N/C
5
N/C
6
N/C
7
/CS
I
8
DO
O
9
/WP
I
10
GND
11
N/C
12
N/C
13
N/C
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档