SPI模拟编程《51例子》

发布者:会哭的蓝精灵最新更新时间:2016-12-13 来源: eefocus关键字:SPI  模拟编程  51例子 手机看文章 扫描二维码
随时随地手机看文章

/********************************************************************************  

      模块名称:       spi.h  

      模块说明:       c51单片机的i/o模拟spi操作  


      创建时间:       2005/03/09  

      创建者:           xichen         

  ********************************************************************************/  


  #ifndef   SPI_H  

  #define   SPI_H     


  sbit   SPIS_N       =   P2^1;  

  sbit   SPIC       =   P2^3;  

  sbit   SPID       =   P2^2;  

  sbit   SPIQ       =   P2^4;  


  extern   void   spi_reset();  

  extern   void   spi_write(unsigned   char   spi_bValue);  

  extern   unsigned   char   spi_read();     


  #endif  




  /*******************************************************************************  

      模块名称:       spi.c  

      模块说明:       c51单片机的i/o模拟spi操作  


      创建时间:       2005/03/09  

      创建者:           xichen     

  ********************************************************************************/  

     #include   "includes.h"  


  #define set_spi_cs() SPIS_N   =1  

  #define clr_spi_cs() SPIS_N   =0  

  #define set_spi_clk()           SPIC   =1  

  #define clr_spi_clk()           SPIC   =0  

  #define set_spi_di() SPID   =1  

  #define clr_spi_di() SPID   =0  

  #define read_spi_do()         SPIQ      


  //------------------------------------------  

  void   spi_reset()  

  {  

      set_spi_cs();   

  }  

  //-----------------------------------------  

  void   spi_write(unsigned   char   spi_bValue)  

  {  

  unsigned   char   no;  


  clr_spi_cs();  


  for   (no=0;no<8;no++)  

  {  

                  clr_spi_clk();      


  if   ((spi_bValue   &0x80)==0x80)  

        set_spi_di();  

    else  

        clr_spi_di();  


                  set_spi_clk();   


  spi_bValue   =   (spi_bValue   <<1);  

  }  

  }  

  //----------------------------------------------  

  unsigned   char   spi_read()  

  {  

  unsigned   char   no,spi_bValue;  


  clr_spi_cs();  


  for (no=0;no<8;no++)  

  {                                                                  

             clr_spi_clk();     

             spi_bValue   =   (spi_bValue   <<1);     

             set_spi_clk();  


             if   (read_spi_do()   ==1)  

                     spi_bValue   |=0x01;  

            else  

                    spi_bValue   &=~0x01;     

  }     

  return   spi_bValue;  

  }   



再一个SPI模拟

#i nclude "COMMON.h"

#i nclude "SPI.H"

#i nclude "INTRINS.H"

/*------------------------------------------------------------------------*/

void SPIReset(void)

{

SPICLK = 0;   

}

/*------------------------------------------------------------------------*/

void SPISendByte(unsigned char UC)

{

unsigned char  i = 0;

    CloseInt();     //要关中断     

for(i=0;i<8;i++)

{

  SPICLK = LOW;

  SPIDI  = (bit)(UC&0x80);UC<<=1;//Delay(0);

  SPICLK = HIGH;//4个nop 8us

  _nop_();

  _nop_();

  _nop_();

  _nop_();

}

    SPICLK = LOW;

OpenInt();//开中断

//开中断

/*

#pragma ASM

PUSH ACC;

PUSH 01H;

MOV 01H,#08H

LOOP:

SETB SPICLK

MOV A,R7;

RLC A;

MOV SPIDI,C;

DJNZ 01,LOOP

POP 01H;

pop  ACC;

#pragma ENDASM

*/

}

/*-------------------------------------------------------------------------*/

void SPIInit(void)

{

SPICLK = LOW;

SPIDI  = LOW;

SPIDO  = HIGH;


}

/*------------------------------------------------------------------------*/

unsigned char SPIReadByte(void)

{


unsigned char i = 0,SPIData = 0;


CloseInt();

//要关中断


for(i=0;i<8;i++)

{

  SPICLK = LOW;Delay8us();

  SPICLK = HIGH;//Delay(10);  //这个时间真还不太好控制

  SPIData=(SPIData<<1)|SPIDO;

}

    SPICLK = LOW;                 



// #pragma ASM

// #pragma ENDASM

OpenInt();//开中断   

return SPIData;

}

/*------------------------------------------------------------------------*/

unsigned long SPIRead24Bit(void)

{

unsigned long SPIData = 0;

unsigned char Data[3] = {0,0,0};  


unsigned char i;

CloseInt();//要关中断

  /*

  for(i=0;i<3*8;i++)

  {


   SPICLK = LOW;Delay8us();Delay8us();Delay8us();Delay8us();Delay8us();Delay8us();

   SPICLK = HIGH;//Delay(8);  //这个时间真还不太好控制


    if(SPIDO)

   {

    SPIData=SPIData<<1;

    SPIData|=0x01;

   }

   else

   {

    SPIData=(SPIData<<1);

    SPIData|=0x00;

   }


  }

  */

for(i=0;i<8;i++)

{

  SPICLK = LOW;Delay8us();Delay8us();Delay6us();

  SPICLK = HIGH;

  Data[0]=(Data[0]<<1)|SPIDO;     


}

for(i=0;i<8;i++)

{

  SPICLK = LOW;Delay8us();Delay8us();Delay6us();

  SPICLK = HIGH;

  Data[1]=(Data[1]<<1)|SPIDO;

}

for(i=0;i<8;i++)

{

  SPICLK = LOW;Delay8us();Delay8us();Delay6us();

  SPICLK = HIGH;

  Data[2]=(Data[2]<<1)|SPIDO;


}   

SPICLK = LOW;

SPIData = Data[0]*65536+Data[1]*256+Data[2];

OpenInt();//开中断                  

return SPIData;

}


关键字:SPI  模拟编程  51例子 引用地址: SPI模拟编程《51例子》

上一篇:几种常用的模拟SPI读写一体化模块(C51)
下一篇:51模拟SPI同步收发程序.C

推荐阅读最新更新时间:2024-03-16 15:25

STM32自学之SPI的DMA操作(寄存器级)
STM32自学之SPI的DMA操作(寄存器级) 一、实验目标 学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。之后看可以利用DMA来实现什么功能~~~ 二、实验目的 加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法: 减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令- 目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且
[单片机]
STM32自学之<font color='red'>SPI</font>的DMA操作(寄存器级)
ESP8266与单片机之间通过SPI进行双向数据传输的一种方案
背景: 在我的毕业设计中需要单片机将采集到的数据上传到服务器,同时需要接收来自服务器的一些天气信息,我的单片机的型号是 Stm32F407; ESP8266 刷入了 micropython 的固件,使用python进行开发; 协议是 SPI协议 ESP8266 主机 Stm32F4作为 从机 单片机侧使用的是 Stm32F407 的硬件 SPI + DMA 接收发送。 ESP8266 侧使用的也是硬件SPI1 ; 通讯速度应该可以跑满 单片机这一侧的极限速度(42MHz),但是我在测试时候发现数据在40M 就很不稳定了(逻辑分析仪测试,可能是导线有点长) 最终就选择了4MHz.。 整体的这个实现的机制就是在单片机里面设
[单片机]
ESP8266与单片机之间通过<font color='red'>SPI</font>进行双向数据传输的一种方案
LPC1788的spi使用
#ifndef __SPI_H_ #define __SPI_H_ #include common.h #include delay.h // cs p1.21 //sck p1.20 //miso p1.23 //mosi p1.24 #define SPI_CLOCK 12000000 void spi0_select_cs(void); void spi0_disSelect_cs(void); u8 spi0_rw_data(u8 writeByte); void spi0_set_speed(u8 speed); void spi0_init(u8 divide); #end
[单片机]
STM32的使用之SPI通信DMA模式
MCU:STM32F303VC 在SPI通信中,可以同时开启发送和接收DMA请求,自动数据的发送和接收,完成数据的交换 基本步骤是: 1. 配置好SPI相应引脚功能 2. 配置和初始化SPI 3. 初始化DMA 4. 片选信号选择要通信的设备 5. 打开DMA 对应DMA通道:SPI1_RX---DMA1_Channel2;SPI1_TX---DMA1_Channel3 代码: #define L3GD20_SPI_TDR (u32)(SPI1_BASE+0x0C) #define L3GD20_SPI_RDR (u32)(SPI1_BASE+0x0C) u8 SPI_TXBUFFER ={0xE8,0x00,0x00,
[单片机]
SPI四种工作模式时序图
1. SPI总线 简介   SPI(serial peripheral interface,串行 外围设备 接口)总线技术是Motorola公司推出的一种同步 串行接口 。它用于CPU与各种外围器件进行全双工、同步串行通讯。它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:串行时钟线(CSK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、 低电平 有效从机选择线CS。当SPI工作时,在移位 寄存器 中的数据逐位从输出引脚(MOSI)输出(高位在前),同时从输入引脚(MISO)接收的数据逐位移到移位寄存器(高位在前)。发送一个字节后,从另一个外围器件接收的字节数据进入移位寄存器中。即完成一
[单片机]
<font color='red'>SPI</font>四种工作模式时序图
STM32CubeMX系列教程19:Quad-SPI
一.Quad-SPI简介 在第十章和第十一章中,我们介绍了标准的SPI总线,SPI由四根线控制,NSS为片选,SCK为时钟信号线。MISO,MOSI为数据线,一根作为输入,一根作为输出。 Quad-SPI,即四线SPI,由此可知其数据线比标准的SPI接口要多,最多支持四条数据线同时传输。 连接单、双或四(条数据线) SPI Flash 存储介质。Quad-SPI总共有6根控制线:CS为片选,CLK为时钟信号线。IO0~IO3为数据线,可以发送数据也可以接收数据。 二.Quad-SPI 命令序列 QUADSPI 通过命令与 Flash 通信 每条命令包括指令、地址、交替字节、空指令和数据这五个阶段 任一
[单片机]
STM32CubeMX系列教程19:Quad-<font color='red'>SPI</font>
STM32 做为SPI从机,读取数据
背景:有一个项目中,其中一个设备通过SPI接口发送给另外一个设备,但是我需要获取这个设备发送的SPI数据信息 STM32的SPI可以作为master,也可以作为slave,作为slave的例程比较少,今天经过几个小时的折腾,终于把数据获取出来了,经验证和元数据是一致的。现将源代码贴在这里,供有需要的人参考。 硬件连接: STM32(作为从设备) 外部设备 PB12-SPI2-NSS------------ CS PB13-SPI2-SCK------------- CLK PB14-SPI2-MISO----NC PB15_SPI2-MOSI----------- data STM32作为从设备的时候,获取
[单片机]
基于虚拟仪器的微震实时监测系统
  在详细介绍96路前端微震信号处理单元、PCI数据采集卡DAQ2208和LabVIEW平台下软件设计的基础上,提出了一种基于虚拟仪器微震实时检测的设计方案。   系统通过软、硬件技术结合,实现了对多路模拟量的微震信号采集及其先进的小波变换处理算法,充分发挥了虚拟仪器的优势,很好地完成了对微震的实时监测及分析。   随着社会与科学技术的发展,能源问题成了世界关注的焦点,而时常发生的煤矿矿难,使得矿区的安全问题成为了企业与政府关注的重点。这些事故的发生一般与开采后应力的重新分布引起的覆岩破裂有关系,岩石破裂会伴随产生强度较弱的地震波,称为“微震”。   微震安全监测系统是通过监测岩体破裂产生的震动或其他物体的震动,对监测对象的破坏
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved