51模拟SPI接口[1]
- 格式:pdf
- 大小:206.19 KB
- 文档页数:3
MC51\AVR MCU 的I2C\SPI\232\485\IO的使用首先:AVR的IO口操作玉日信有三个寄存器:DDR xn PORTxn PINxnDD Rxn(方向选择):1为输出0为输入PORTxn:在引脚为输入的前提下,为1上啦电阻使能0不使能在引脚为输出的前提下,为1输出高电平0输出低电平PINxn:通过读取PINxn来得到该引脚的状态,他不会所存状态,他读到的只是当前管脚的电平状态。
注意:xn是 A B CD..口管脚设置PA口的第一个脚为输出:DDRA|=0x01;51单片机的IO口操作比如现让P1.7为输出,其余为输入,P2=0x0111 1111B,也就是0x7F。
=============================================================一、模拟SPI的使用时钟是100KHZ这样延时3微妙一周期6微妙这样最大传输速度为输入时钟频率的1/8CS输出低电平→MOSI与1向与→CLK输出一个脉冲→MOSI的数据右移动一位与1相与→ CLK输出一个脉冲……输出够8位(一个字节了)再下一个字节或者停止→停止之后CS拉高CS输出低电平→ CLK输出一个脉冲→MISO管脚取数据→ CLK输出一个脉冲→MISO管脚取数据→ CLK输出一个脉冲……输入够8位(一个字节了)再下一个字节或者停止→停止之后CS拉高3、一个主机和多个从器件的通信系统。
(2)3个既可以当做主机也可以当做从机的单片机组成的系统。
特点:SPI是一位一位发送的,并允许暂停,发多少位都行,不用寻址操作AVR有SPI功能接口的单片机SPI操作时钟是最大1/4 FOSC 最小1/128 FOSC把数据写到数据寄存器→CS拉低(启动一次通信)→再把数据写到数据寄存器→CS拉低(启动一次通信)→CS拉高结束通信注意:是时钟的上升沿还是下降沿有效时可以设置的---CPHA为1上升沿采样数据,为0下降沿采样数据,传输结束了SPIF会置位高位还是地位先发送是可以设置的----DORD为1地位先发送为0高位先发送数据寄存器SPFR是可读可写的—写数据进去就启动数据传输,读数据将读取数据的接收缓存区在主模式下,时钟信号的1次作用对应一位数据的发送(MOSI)和另一位数据的接收(MISO)。
51模拟SPI接口在MCS51系列单片机中的实现方法对于不带SPI串行总线接口的MCS51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。
对于不同的串行接口外围芯片,它们的时钟时序是不同的。
对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接口后再置P1.1为0。
这样,MCU 在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS51系列单片机从P1.0(模拟MCU的MOSI线)输出1位数据(先为高位)至串行接口芯片。
至此,模拟1位数据输入输出便宣告完成。
此后再置P1.1为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。
对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置P1.1为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。
图2所示为MCS51系列单片机与存储器X25F008(E2PROM)的硬件连接图,有关X25F008的详细资料可参考有关文献〔1〕。
图2中,P1.0模拟MCU的数据输出端(MOSI),P1.1模拟SPI的SCK输出端,P1.2模拟SPI的从机选择端,P1.3模拟SPI的数据输入端(MISO)。
下面介绍用MCS51单片机的汇编语言模拟SPI串行输入、串行输出和串行输入/输出的3个子程序。
实际上,这些子程序也适用于在串行时钟的上升沿输入和下降沿输出的其它各种串行外围接口芯片(如A/D转换芯片、网络控制器芯片、LED显示驱动芯片等)。
对于下降沿输入、上升沿输出的各种串行外围接口芯片,只要改变P1.1的输出电平顺序,即先置P1.1为低电平,之后再次置P1.1为高电平,再置P1.1为低电平……,则这些子程序也同样适用。
一、总则本文件介绍了在51平台通过SPI方式读写SD/MMC卡,包括软硬件需求, SD/MMC硬件连接, SPI接口软件模拟,SD/MMC上电初始化,写单块,读单块,写多块,读多块,块擦除,上位串口通讯协议,PC上位软件操作说明等。
二、软硬件需求a) 单片机固件编译环境:Keil C51 uVision2b) PC上位软件编译环境:Visual C++ 6.0c) 硬件环境:1)W78E52B一片;2)SD/MMC卡插座一个;3)MAX232一片;4)cross串口线一条;三、SD/MMC硬件连接SD/MMC与51单片机引脚连接如下表1,供参考:51单片机引脚SD/MMC引脚P1_0SPI_CS (PIN1)P1_1SPI_SI(PIN2)P1_2SPI_SCK(PIN5)P1_3SPI_SO(PIN7)PIN4接VDDPIN3/6接GND表1 SD/MMC与51单片机引脚连接表注意:SD/MMC引脚除VDD(PIN4)/VSS(PIN3/6)外,其它引脚连接上拉电阻(47k)至3.3v 电源。
四、SPI接口软件模拟由于W78E52B没有集成硬件SPI接口,所以固件需要通过软件来模拟实现SPI接口;a) SPI接口基本原理:SPI采用HOST/SLAVE结构,HOST与SLA VE以字节为传输单位,支持4种模式;SPI接口定义有4个引脚CS,SI,SO,SCK;SD SPI接口工作于模式0,各引脚功能分别描述如下:1) CS为片选引脚,低电平为有效;2) SI为Host输出Slave输入引脚,空闲为高电平,SCK上升有效,;3) SO为Slave输出Host输入引脚,SCK下降有效;4) SCK为同步时钟;b) SPI HAL:包括4个函数,上层软件通过调用这4个函数,来实现与SD/MMC以SPI方式进行数据交换。
1) SPI_SendByte(INT8U onebyte)――以SPI方式向SD/MMC发送一个字节2) INT8U SPI_RecByte(void)――以SPI方式从SD/MMC接收一个字节3) SPI_CS_Assert(void)――将CS引脚置为低电平有效4) SPI_CS_Deassert(void)――将CS引脚置为高电平无效c) 通过SPI HAL发送的RESET命令CMD0波形图,如下图1,以供参考:图1-RESET命令CMD0波形图一、SD/MMC上电初始化当SD/MMC卡上电后,单片机需要对其进行上电初始化,上电初始化步骤顺序所列如下:1) 置CS为低,至少延时74个CLK,延时波形图,如图2,以供参考:图2-延时波形图1) 发送RESET命令CMD0,其波形图参考图1:2) 发送命令CMD1(SD卡使用命令ACMD41)激活SD/MMC卡, 固件需重复发送命令CMD1直到R1 idle state位为0。
几种常用的模拟SPI读写一体化模块(C51)几种常用的模拟SPI读写一体化模块(C51)原文:说明:SPI接口有一个特点,即在时钟SCK的上升沿打入数据MOSI,在下降沿读入数据MISO.片选信号CS有正负区别.在硬件上MOSI与MISO是可以短路变为SIO可读写IO的.故SPI可为(不包括CS)三线(SCK,MOSI,MISO)协议,两线(SCK,SIO)协议再者,SPI一般为双向同时高速收发数据的,方向由时钟SCK的跳变沿决定。
根据以上所述,模拟SPI读写模块编制成为一体化模块是必要的。
而且调用规则只需注意读数据时要写入0xff即可。
非常方便好用。
例如:res = SpiReadWrite(val);//模块写SpiReadWrite(0xff);//模块读对于具体器件,由于涉及到命令、地址及数据等,故一个完整的SPI读或写操作可能需要几个模拟SPI读写一体化模块来完成。
所以一般完整的SPI读或写操作需以下函数组合完成void SpiOpen(void); //打开片选 CS=0或CS=1void SpiClose(void); //关闭片选 CS=1或CS=0unsigned char SpiReadWrite(val); //模拟SPI读写一体化模块void SpiWriteEnable(void); //使能写操作void SpiWriteD ISA ble(void); //禁止写操作unsigned char SpiReadStatus(void); //读状态void SpiWriteStatus(unsigned char val); //写状态void SpiWriteWait(void); //等待写入完成void SpiWriteByte(unsigned int addr, unsigned char val);//写一个字节void SpiWriteWord(unsigned char addr, unsigned int val);//写一个字unsigned char SpiReadByte(unsigned int addr); //读一个字节unsigned int SpiReadWord(unsigned char addr); //读一个字/*----------------------------------------------------------------------------/*-----------------------------------------------例:X5045模拟SPI读写一体化模块PTR905模拟SPI读写一体化模块------------------------------------------------*unsigned char SpiReadWrite(unsigned char val){unsigned char i;ACC = val;for (i = 8; i > 0; i --){CY = MISO;//取数据SO_rlca_();//存数据ACC.0读数据ACC.7同时进行MOSI = CY;//送数据SISCK = 1;//上升沿打入数据_nop_();//延时SCK = 0;//下降沿读入数据}return ACC;}/*----------------------------------------------- 例:X5045模拟SPI读写一体化模块ISD4004模拟SPI读写一体化模块------------------------------------------------* unsigned char SpiReadWrite(unsigned char val) {unsigned char i;ACC = val;for (i = 8; i > 0; i --){SCK = 0;//下降沿读入数据_nop_();//延时CY = MISO;//取数据SO_rlca_();//存数据ACC.0读数据ACC.7同时进行MOSI = CY;//送数据SI_nop_();//延时SCK = 1;//上升沿打入数据MOSI = 1;//释放总线SI}return ACC;}/*----------------------------------------------- 例:AT93C46模拟SPI读写模块------------------------------------------------* sbit ACC_7 = ACC^7;unsigned char SpiReadWrite(unsigned char val) {unsigned char i;ACC = val;for (i = 8; i > 0; i --){CY = ACC_7;//读数据ACC.7MOSI = CY;//送数据SISCK = 1;//上升沿打入数据CY = MISO;//取数据SO_rlca_();//存数据ACC.0SCK = 0;//下降沿}return ACC;}。
鉴于 51 单片机的SPI 总线鉴于 51 单片机的 SPI 总线单片机和其余芯片或设施之间的数据传输在单片机的使用中拥有重要的地位,单片机自己的数据传输接口过去主要为 8 位并行数据接口或异步串行通讯接口,但电子技术的快速发展使得很多新的数据传输接口标准不停浮现,大部分的51单片机并无在硬件中集成这些新的数据传输接口。
SPI(Serial Peripheral Interface)总线是由Motorola 企业提出的一种同步串行外头接口,采纳三或四根信号线。
51 单片机一般并无在硬件中集成这类新的接口,因此要用软件来进行模拟。
1 硬件设计DS1302是涓流充电时钟芯片,内含有一个实不时钟/日历和31 字节静态R AM,实不时钟/日历电路供给秒、分、时、日、礼拜、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可经过AM/PM指示决定采纳 24 或 12 小时格式。
DS1302和单片机之间能简单地采纳SPI 同步串行的方式进行通讯,仅需用到三根信号线: RES(复位 ) ,I /O(数据线 ) ,SCLK(同步串行时钟 ) 。
经过16 02LCD显示日期和时间,其电路以下所示。
在桌面上双击图标,翻开 ISIS 7 Professional窗口(自己使用的是v7.4 SP3 中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保留文件名为“”。
在器件选择按钮中单击“ P”按钮,或履行菜单命令“库”→“拾取元件/符号”,增添以下表所示的元件。
51 单片机 AT89C51一片晶体CRYSTAL 12MHz一只瓷片电容 CAP 22pF二只电解电容CAP-ELEC 10uF一只电阻 RES 10K一只排阻RESPAC-8 10K一只1602 液晶显示器 LM016L一只晶体一只时钟芯片 DS1302一片电池BATTERY 3V一只若用 Proteus 软件进行仿真,则上图中的两只晶体、U1的复位电路和 U1 的 31 脚以及电池都能够不画,它们多半是默认的。
SPI总线从机接口实时模拟的实现SPI(Serial Peripheral Interface)总线是一种用于串行通信的同步接口协议,常用于嵌入式系统中的外围设备之间的通信。
SPI总线由一个主设备和一个或多个从设备组成,主设备通过时钟信号控制数据的传输。
在实时模拟SPI总线从机接口时,我们需要实现以下几个关键的功能:1.时钟信号生成:SPI总线的通信是通过时钟信号来同步的,因此我们需要在从机接口中生成正确的时钟信号。
可以通过使用定时器或者外部时钟信号源,按照SPI总线的时序要求生成时钟信号。
2.数据收发:SPI总线的通信是全双工的,即可以同时收发数据。
从机接收主机发送的数据,同时向主机发送响应的数据。
我们需要实现数据的收发功能,可以通过串口或者并口方式将数据从主机传输到从机,同时将从机的响应数据传输回主机。
3.数据帧格式解析:SPI总线中的数据是按照一定格式进行传输的,我们需要在从机接口中解析数据帧的格式。
数据帧通常包括数据位、校验位、起始位和停止位等信息。
在接收数据时,需要正确解析数据帧的格式,提取出有效的数据,并进行校验。
4.状态监测:在实时模拟从机接口时,需要监测SPI总线状态的变化。
包括时钟信号的变化、数据收发的状态和错误状态等。
在监测到状态的变化时,应及时进行相应的操作,例如更新数据、发送响应等。
5.错误处理:在SPI总线通信中,可能会出现各种错误,如数据传输错误、时钟信号失效等。
我们需要在从机接口中实现错误的检测和处理机制,以保证数据的可靠传输。
实时模拟SPI总线从机接口的实现,需要根据具体的硬件平台和所使用的编程语言进行相应的开发。
通常可以借助现有的软件库或者开发工具来简化开发过程,如使用Arduino等开发板、C语言或Python等编程语言。
总之,实时模拟SPI总线从机接口的实现需要考虑时钟信号生成、数据收发、数据帧格式解析、状态监测和错误处理等关键功能。
通过合理的设计和开发,可以实现SPI总线从机接口在软件上的模拟,以满足相应的通信需求。
【51单片机SD卡SPI模式操作】摘要:sd卡有两种接口模式,一种是sd模式,另一种是spi模式。
在spi模式下,有六根接口线与主机相连,5V电平的51单片机通过电平转换可与3.3V电平的sd卡相连接。
51单片机没有专门的spi总线,可以用51单片机的IO口来模拟spi总结时序。
主机与sd卡的数据交换主要通过命令来实现,通过发送cmd0命令对sd卡进行复位,发送命令cmd1实现sd卡的spi模式初始化。
cmd17、cmd18命令是sd卡的读写扇区命令,对sd卡的操作是严格按照时序进行的。
关键词:sd卡;spi接口;时序sd卡以其大容量、低成本、携带方便、存储数据简单和安全可靠性高被大量应用于数码电子设备中,比如数码相机、数码摄像机、mp3、pda、电子学习机、电子图书等。
对sd卡的操作有复位、初始化、读写等,下面以本人掌握的材料对sd卡的操作进行分析。
一、sd卡的结构sd卡的外形与接口如图1,它有9个接点与主机相连,其接口端定义如表1所示。
sd卡有两种操作模式,一种是sd模式,另一种是spi模式,不同模式下端口的定义不同。
SD模式有一个时钟线、一个命令/反馈线、四根输入/输出信号线、两个电源地和一个电源,所有九根线都有定义,数据传输速率较快。
SPI模式只用到CS片选、数据输入、数据输出、时钟、电源地及电源六根线。
SPI模式较SD模式速度较慢,但很多单片机都有专用的SPI总线,可与sd卡直接相连,使用方便。
SD卡的内部结构如图2所示,主要有四部分组成,一是接口电路,共有九个接口电路,定义如表1所示。
二是接口控制电路,所有操作都由该控制电路具体去执行。
三是内部寄存器组OCR、CID、RCA等。
四是存储数据的存储单元。
接口电路通过控制电路与内部寄存器组成存储单元交换数据,其主要操作有写命令、读数据、写数据、读状态等。
二、sd卡的命令格式sd卡的命令格式固定为6个字节48个位,其格式如图3所示。
开始位固定为0,第二位固定为1,表示主机给sd卡的命令,然后是6位命令索引号,索引号的大小与索引号数字相同,比如cmd0的索引号为000000,索引号41为101001。
关于模拟SPI接口SPI:Serial Peripheral InterfaceSPI接口由四个通道组成:片选信号通道(CS),时序信号通道(SCLK),数据输入通道(Din),数据输出通道(Dout)组成。
通道名在不同器件中可能不同,且部分器件的SPI接口中会缺少Dout通道,但其实际应用依然参照SPI的基本时序。
模拟SPI接口就是模拟其工作时序,数据在SCLK上升沿被MCU写入,在下降沿被MCU读取。
其余按DATASHEET描述编写。
例子:模拟X5045 SPI写时序:/*****************************************************函数原型:void writeMemoryArrayclock_SPI(unsigned char clock)功能:模拟SPI写时序。
******************************************************void writeMemoryArrayclock_SPI(unsigned char dat){int i;for (i=8;i>0;i--) //数据循环8次{if (dat & 0x80)x5045_SI = 1;elsex5045_SI = 0; //数据锁存在SI线内nNop(5);x5045_SCK = 0;nNop(5);x5045_SCK = 1; //上升沿数据输入dat= dat << 1; //数据左移一位}x5045_SI = 0;nNop(5);x5045_SCK = 0;}例子:模拟X5045 SPI读时序/*************************************************************** 函数原型:void readMemoryArrayclock_SPI(unsigned char dat)功能:模拟SPI读时序。
51模拟SPI接口
在MCS51系列单片机中的实现方法
对于不带SPI串行总线接口的MCS51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。
对于不同的串行接口外围芯片,它们的时钟时序是不同的。
对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接口后再置P1.1为0。
这样,MCU 在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS51系列单片机从P1.0(模拟MCU的MOSI线)输出1位数据(先为高位)至串行接口芯片。
至此,模拟1位数据输入输出便宣告完成。
此后再置P1.1为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。
对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置P1.1为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。
图2所示为MCS51系列单片机与存储器X25F008(E2PROM)的硬件连接图,有关X25F008的详细资料可参考有关文献〔1〕。
图2中,P1.0模拟MCU的数据输出端(MOSI),P1.1模拟SPI的SCK输出端,P1.2模拟SPI的从机选择端,P1.3模拟SPI的数据输入端(MISO)。
下面介绍用MCS51单片机的汇编语言模拟SPI串行输入、串行输出和串行输入/输出的3个子程序。
实际上,这些子程序也适用于在串行时钟的上升沿输入和下降沿输出的其它各种串行外围接口芯片(如A/D转换芯片、网络控制器芯片、LED显示驱动芯片等)。
对于下降沿输入、上升沿输出的各种串行外围接口芯片,只要改变P1.1的输出电平顺序,即先置P1.1为低电平,之后再次置P1.1为高电平,再置P1.1为低电平……,则这些子程序也同样适用。
3.1MCU串行输入子程序SPIIN
从X25F008的SPISO线上接收8位数据并放入寄存器R0中的应用子程序如下:
3.2MCU串行输出子程序SPIOUT
将MCS51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下:
3.3MCU串行输入/输出子程序SPIIO
将MCS51单片机R0寄存器的内容传送到X25F008的SPISI中,同时从X25F008的SPISO 接收8位数据的程序如下:。