单片微型计算机原理及接口技术-22-串行通信-SPI-6_第1页
单片微型计算机原理及接口技术-22-串行通信-SPI-6_第2页
单片微型计算机原理及接口技术-22-串行通信-SPI-6_第3页
单片微型计算机原理及接口技术-22-串行通信-SPI-6_第4页
单片微型计算机原理及接口技术-22-串行通信-SPI-6_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片微型计算机原理及接口技术(22)1/20内容提纲二STC8H8K64U单片机SPI接口的应用举例一STC8H8K64U单片机SPI接口的寄存器2/20STC8H8K64U单片机SPI接口的寄存器一3/20与SPI接口有关的特殊功能寄存器如表8-9所示。寄存器地址b7b6b5b4b3b2b1b0复位值SPICTLCEHSSIGSPENDORDMSTRCPOLCPHASPR1SPR000000100BSPSTATCDHSPIFWCOL------00xxxxxxBSPDATCFH

00000000B4/20(1)SPI控制寄存器(SPCTL)

寄存器地址b7b6b5b4b3b2b1b0复位值SPICTLCEHSSIGSPENDORDMSTRCPOLCPHASPR1SPR000000100B5/205)位3:CPOL,SPI时钟极性选择位。0:SPI空闲时SCK=0(低电平),SCK的前时钟沿为上升沿而后沿为下降沿;1:SPI空闲时SCK=1(高电平),SCK的前时钟沿为下降沿而后沿为上升沿。6)位2:CPHA,SPI时钟相位选择控制位。0:数据SS管脚为低电平驱动第一位数据并在SCLK的后时钟沿改变数据,前时钟沿采样数据(必须SSIG=0);1:数据在SCLK的前时钟沿驱动,后时钟沿采样。7)位1:SPR1,与SPR0联合构成SPI时钟速率选择控制位。8)位0:SPR0,与SPR1联合构成SPI时钟速率选择控制位。SPI时钟选择见表8-10。SPR1SPR0时钟(SCLK)00SYSclk/401SYSclk/810SYSclk/1611SYSclk/32表8-10

SPI时钟频率的选择其中,SYSclk是系统时钟频率。6/20(2)SPI状态寄存器(SPSTAT)

(3)SPI数据寄存器(SPDAT)地址b7b6b5b4b3b2b1b0复位值CFHMSB

LSB00H7/20STC8H8K64U单片机SPI接口的应用举例二8/20

9/20

【例8-5】利用STC8H8K64U单片机对W25X40CL进行读写操作。大容量的串行Flash存储器在实际工程中得到了应用,可用来保存生产数据、语音数据、汉字字库等。W25X40CL是一款容量为4Mbit高速存储器,工作电压2.3V~3.6V。图8-30W25X40CL的引脚分布图图8-31W25X40CL内部结构框图W25X40CL的详细介绍请参见教材内容。10/20STC8H8K64U单片机连接W25X40CL的电路图如图8-32所示。图8-32STC8H8K64U单片机连接W25X40CL的电路图11/20

部分代码:/*************串行FLASH引脚声明**************/sbitSF_CS=P2^2;//PIN1sbitSF_SO=P2^4;//PIN2sbitSF_SI=P2^3;//PIN5sbitSF_SCK=P2^5;//PIN6//SPI相关函数

voidSPI_init(void){SPCTL=0xd2;//11010010//忽略SS引脚功能,使用MSTR确定器件是主机还是从机//使能SPI功能;先传输数据高位(MSB);设置主机模式//SCLK空闲时为低电平,前沿为上升沿,后沿为下降沿//SS管脚为低电平驱动第一位数据并在SCLK的后沿改变数据//SPI时钟频率选择,16分频P_SW1=(P_SW1&0xf3)|0x04;//SPI口切换到:P2.2P2.3P2.4P2.5SF_SCK=0; //设置时钟的初始电平为低SF_SI=1;SPSTAT=SPIF+WCOL;//清0SPIF和WCOL标志}

12/20voidSPI_WriteByte(u8out)//SPI写一个字节{SPDAT=out;while((SPSTAT&SPIF)==0);SPSTAT=SPIF+WCOL;//清0SPIF和WCOL标志}u8SPI_ReadByte(void)//SPI读一个字节{SPDAT=0xff;while((SPSTAT&SPIF)==0);SPSTAT=SPIF+WCOL;//清0SPIF和WCOL标志return(SPDAT);}13/20//FLASH相关宏定义

#defineSFC_WREN0x06//串行Flash命令集(具体说明请参见数据手册)#defineSFC_RDSR0x05#defineSFC_READ0x03#defineSFC_RDID0xAB#defineSFC_PAGEPROG0x02#defineSFC_SECTORER0x20//W25Xxx扇区擦除指令#defineSFC_CHIPER0xC7#defineSPI_CS_High()SF_CS=1//setCEhigh#defineSPI_CS_Low()SF_CS=0//clearCElow//FLASH相关函数

u8FlashCheckID(void)//检测器件ID{u8id;

SPI_CS_Low();SPI_WriteByte(SFC_RDID);//发送读取ID命令SPI_WriteByte(0x00);//空读3个字节SPI_WriteByte(0x00);SPI_WriteByte(0x00);id=SPI_ReadByte();//读取设备IDSPI_CS_High();return(id);}14/20u8CheckFlashBusy(void)//检测Flash的忙状态:1-忙;0-空闲{u8dat;

SPI_CS_Low();SPI_WriteByte(SFC_RDSR);//发送读取状态命令dat=SPI_ReadByte();//读取状态SPI_CS_High();return(dat);//状态值的Bit0即为忙标志}voidFlashWriteEnable(void)//使能Flash写{while(CheckFlashBusy()>0);//Flash忙检测SPI_CS_Low();SPI_WriteByte(SFC_WREN);//发送写使能命令SPI_CS_High();}15/20voidFlashSectorErase(u32addr)//擦除扇区,一个扇区4KB{FlashWriteEnable();//使能Flash写命令

SPI_CS_Low();SPI_WriteByte(SFC_SECTORER);//发送扇区擦除命令

SPI_WriteByte(((u8*)&addr)[1]); //设置起始地址

SPI_WriteByte(((u8*)&addr)[2]);SPI_WriteByte(((u8*)&addr)[3]);SPI_CS_High();}voidSPI_Read_Nbytes(u32addr,u8*buffer,u16size)//从Flash中读取数据函数

{if(size==0)return;while(CheckFlashBusy()>0);//Flash忙检测

SPI_CS_Low();//选中器件

SPI_WriteByte(SFC_READ);//发出读命令

SPI_WriteByte(((u8*)&addr)[1]);//设置起始地址

SPI_WriteByte(((u8*)&addr)[2]);SPI_WriteByte(((u8*)&addr)[3]);do{*buffer=SPI_ReadByte();//读取一个字节并保存到缓冲区中

buffer++;}while(--size);//循环读所需的字节数

SPI_CS_High();//取消器件选中}16/20//读出n个字节,跟指定的数据进行比较,错误返回1,正确返回0u8SPI_Read_Compare(u32addr,u8*buffer,u16size){u8j;if(size==0)return2;while(CheckFlashBusy()>0);//Flash忙检测

j=0;SPI_CS_Low();//enabledeviceSPI_WriteByte(SFC_READ);//readcommandSPI_WriteByte(((u8*)&addr)[1]);//设置起始地址

SPI_WriteByte(((u8*)&addr)[2]);SPI_WriteByte(((u8*)&addr)[3]);do{if(*buffer!=SPI_ReadByte())//receivebyteandstoreatbuffer{j=1;break;}buffer++;}while(--size);//readuntilno_bytesisreachedSPI_CS_High();//disabledevicereturnj;}17/20//写数据到Flash中的函数voidSPI_Write_Nbytes(u32addr,u8*buffer,u8size){if(size==0)return;while(CheckFlashBusy()>0);//Flash忙检测

FlashWriteEnable();//使能Flash写命令

SPI_CS_Low();//enabledeviceSPI_WriteByte(SFC_PAGEPROG);//发送页编程命令

SPI_WriteByte(((u8*)&addr)[1]);//设置起始地址

SPI_WriteByte(((u8*)&addr)[2]);SPI_WriteByte(((u8*)&addr)[3]);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论