新唐M051 spi使用程序

发布者:丝路老君最新更新时间:2014-12-12 来源: 51hei关键字:新唐M051  spi 手机看文章 扫描二维码
随时随地手机看文章

#include "SPI.h"
#define DEBUGMSG printf
STATIC UINT32  g_unSpi0Rx0Data = 0, g_unSpi1Rx0Data = 0;
/****************************************
*函数名称:Spi0MasterInit
*输    入:无
*输    出:无
*功    能:SPI0初始化为主机模式
******************************************/
VOID Spi0MasterInit(VOID)
{                                    
    P1_MFP &= ~(P14_AIN4_SPI0SS | P15_AIN5_SPI0MOSI | P16_AIN6_SPI0MISO | P17_AIN7_SPI0CLK); 
 P1_MFP |= (SPI0SS | SPI0MOSI | SPI0MISO | SPI0CLK) ;      //使能SPI0相关引脚
 ENABLE_SPI0_CLK;         //SPI0时钟使能                  
    SPI0_SSR &= ~LVL_H;           //从机选择选择信号通过低电平激活
    SPI0_CNTRL &= ~LSB_FIRST;    //优先发送/接收最高有效位
    SPI0_CNTRL &= ~CLKP_IDLE_H;      //SCLK空闲时为低电平
    SPI0_CNTRL |= TX_NEG_F;       //SDO 信号在SPICLK的下降沿改变
    SPI0_CNTRL &= ~RX_NEG_F;       //SDI 信号在SPICLK上升沿锁存
    CLKDIV &= 0xFFFFFFF0;               //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
    SPI0_DIVIDER &= 0xFFFF0000;         //SPIclk = Pclk/((HCLK_N+1)*2)
    SPI0_DIVIDER |= 0x00000002;   
    SET_SPI0_MASTER_MODE;            //SPI0工作在主机模式
    ENABLE_SPI0_AUTO_SLAVE_SLECT;    //使能自动从机选择
    SPI0_SSR |= SSR_ACT;     
}
/****************************************
*函数名称:Spi0Send1W
*输    入:ulData    发送的数据
          ucLength  数据长度
*输    出:无
*功    能:SPI0发送数据
******************************************/
VOID Spi0Send1W(UINT32 ulData, UINT8 ucLength)
{
    SPI0_CNTRL &= TX_NUM_ONE;      
    Spi0Length(ucLength);
    SPI0_TX0 = ulData;
    SPI0_CNTRL |= GO_BUSY;         
}

 

/****************************************
*函数名称:GetSlaveID
*输    入:无
*输    出:无
*功    能:获取从机ID
******************************************/
VOID GetSlaveID(VOID)
{
    Spi0Send1W(0x00000055, 0x08);
    while((SPI0_CNTRL & GO_BUSY)!=0);

    Spi0Send1W(0x00000000, 0x08);
    while((SPI0_CNTRL & GO_BUSY)!=0);
    g_unSpi0Rx0Data = SPI0_RX0;
}
/****************************************
*函数名称:Spi0Length
*输    入:ucLength 数据长度
*输    出:无
*功    能:设置SPI0数据长度
******************************************/
VOID Spi0Length(UINT8 ucLength)
{
     if(ucLength <= 0x20)
    {
        if((ucLength & 0x01) == 0)
            SPI0_CNTRL &= ~(1<<3);
        else
            SPI0_CNTRL |= (1<<3);
        if((ucLength & 0x02) == 0)
            SPI0_CNTRL &= ~(1<<4);
        else
            SPI0_CNTRL |= (1<<4);

        if((ucLength & 0x04) == 0)
            SPI0_CNTRL &= ~(1<<5);
        else
            SPI0_CNTRL |= (1<<5);

        if((ucLength & 0x08) == 0)
            SPI0_CNTRL &= ~(1<<6);
        else
            SPI0_CNTRL |= (1<<6);

        if((ucLength & 0x10) == 0)
            SPI0_CNTRL &= ~(1<<7);
        else
            SPI0_CNTRL |= (1<<7);
    }
}
/****************************************
*函数名称:Spi1SlaveInit
*输    入:无
*输    出:无
*功    能:SPI1初始化为从机
******************************************/
VOID Spi1SlaveInit(VOID)
{                              
    P0_MFP &= ~(P04_AD4_SPI1SS | P05_AD5_SPI1MOSI | P06_AD6_SPI1MISO | P07_AD7_SPI1CLK); 
 
 P0_MFP |= (SPI1SS | SPI1MOSI | SPI1MISO | SPI1CLK) ;      //使能SPI1相关引脚 
 ENABLE_SPI1_CLK; 
 SPI1_SSR &= LTRIG_EDG;         //从机输入边沿触发
    SPI1_SSR &= ~LVL_H;          //从机选择选择信号通过低电平激活

    SPI1_CNTRL &= ~LSB_FIRST;      //优先发送/接收最高有效位
    SPI1_CNTRL &= ~CLKP_IDLE_H;      //SCLK空闲时为低电平
    SPI1_CNTRL |= TX_NEG_F;       //SDO 信号在SPICLK的下降沿改变
    SPI1_CNTRL &= ~RX_NEG_F;       //SDI 信号在SPICLK上升沿锁存

    CLKDIV &= 0xFFFFFFF0;               //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
    SPI1_DIVIDER &= 0xFFFF0000;         //SPIclk = Pclk/((HCLK_N+1)*2)
    SPI1_DIVIDER |= 0x00000002;
    SET_SPI1_SLAVE_MODE;          //SPI1工作在从机模式
   
    ENABLE_SPI1_INTERRUPT;        //使能SPI1中断
    NVIC_ISER |= SPI1_INT;       
    Spi1Length(8);         //设置SPI1数据长度
    SPI1_GO_BUSY;                 //等待SPI1 RX0接收信号
}  
/****************************************
*函数名称:Spi1Length
*输    入:ucLength 数据长度
*输    出:无
*功    能:设置SPI1数据长度
******************************************/
VOID Spi1Length(UINT8 ucLength)
{
     if(ucLength <= 0x20)
    {
        if((ucLength & 0x01) == 0)
            SPI1_CNTRL &= ~(1<<3);
        else
            SPI1_CNTRL |= (1<<3);
        if((ucLength & 0x02) == 0)
            SPI1_CNTRL &= ~(1<<4);
        else
            SPI1_CNTRL |= (1<<4);

        if((ucLength & 0x04) == 0)
            SPI1_CNTRL &= ~(1<<5);
        else
            SPI1_CNTRL |= (1<<5);

        if((ucLength & 0x08) == 0)
            SPI1_CNTRL &= ~(1<<6);
        else
            SPI1_CNTRL |= (1<<6);

        if((ucLength & 0x10) == 0)
            SPI1_CNTRL &= ~(1<<7);
        else
            SPI1_CNTRL |= (1<<7);
    }
}
/****************************************
*函数名称:PrintGetData
*输    入:无
*输    出:无
*功    能:打印SPI0/1接收到的数据
******************************************/
VOID PrintGetData(VOID)
{
    DEBUGMSG("Slave Get Command = %X ", g_unSpi1Rx0Data);
    DEBUGMSG("Master Get Feed Back Data = %X ", g_unSpi0Rx0Data);
}
/*****************************************
*函数名称:SPI1_IRQHandler
*输    入:无
*输    出:无
*功    能:SPI1中断服务函数
******************************************/
VOID SPI1_IRQHandler(VOID)
{
    SPI1_CNTRL |= SPI_IF;       //清除中断标志
    if(SPI1_RX0 == 0x55)
    {
        g_unSpi1Rx0Data = SPI1_RX0;
        SPI1_TX0 = 0x000000DA;
    }
    else
        SPI1_TX0 = 0x00000000;
    SPI1_GO_BUSY;                //等待SPI1 RX0接收信号
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
    PROTECT_REG                //ISP下载时保护FLASH存储器
 (
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
      CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟 
 ) 
 UartInit(12000000,9600);      //波特率设置为9600bps 
    Spi0MasterInit();        //SPI0初始化为主机模式
    Spi1SlaveInit();        //SPI1初始化为从机模式   
    while(1)
    {
        DEBUGMSG("Master will send 0x55 data to slave and receive 0xDA data ");
        DEBUGMSG("Put AnyKey to Start Test ");
        GetSlaveID();
        PrintGetData();
        printf(" "); 
  Delayms(1000);
    }
}

关键字:新唐M051  spi 引用地址:新唐M051 spi使用程序

上一篇:新唐M051 ADC模数转换程序
下一篇:新唐M051 WDT看门狗使用程序

推荐阅读最新更新时间:2024-03-16 13:48

MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 上机实战 SPI 驱动 墨水屏 墨水屏介绍 F5529 口袋板上没有采用常见的点阵液晶、段式液晶、TFT 等屏幕,而是采用了电子纸 (电子墨水屏)这种革新的信息显示设备,它与传统的显示屏幕有很大不同,下面略作介绍。 电子纸的分类 如同其他显示技术一样,电子纸主要也分为以下以下几类:  电泳显示技术(EPD):电泳显示技术系将黑、白两色的带电颗粒封装于微胞化液 滴结构中,由外加电场控制不同电荷黑白颗粒的升降移动,以呈现出黑白单色的
[单片机]
MSP430F5529 DriverLib 库函数学习笔记(十)<font color='red'>SPI</font>驱动墨水屏
SPI、IIC、UART、can区别
第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增
[单片机]
<font color='red'>SPI</font>、IIC、UART、can区别
武汉新芯50nm高性能的SPI NOR Flash产品全线量产
紫光集团旗下武汉新芯集成电路制造有限公司(以下简称“武汉新芯”),一家领先的非易失性存储供应商,宣布其采用50nm Floating Gate工艺SPI NOR Flash宽电压产品系列XM25QWxxC全线量产,产品容量覆盖16Mb到256Mb。该系列支持低功耗宽电压工作,为物联网、可穿戴设备和其它功耗敏感应用提供灵活的设计方案。 XM25QWxxC系列产品在1.65V至3.6V电压范围内读取速度可达133MHz(在所有单/双/四通道和QPI模式下均支持),工作温度范围可达-40℃到105℃。在电源电压下降后,时钟速度没有任何减慢,其传输速率可以胜过8位和16位并行闪存。在连续读取模式下能实现高效的存储器访问,仅需8个时钟的指
[手机便携]
Proteus仿真stm32f103实现SPI
单片机源程序如下: #include stm32f10x.h #include spi.h #include Module.h #include stdio.h void Delay_Ms(u16 time); void RCC_Configuration(void); //void GPIO_Configuration(void); u32 retry=0; int i=0; /* Private functions ---------------------------------------------------------*/ /*******************************
[单片机]
【STC15库函数上手笔记】9、硬件SPI
STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 摘自《STC15系列单片机器件手册》 STC15系列单片机还提供另一种高速串行通信接口——SPI接口。SPI是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达3Mbps的速率(工作频率为12MHz时,如果CPU主频采用20MHz到36MHz,则可更高,从模式时速度无法太快,SYSclk/4以内较好),还具有传输完成标志和写冲突标志保护。 下表总结了STC15系列单片机内部集成了SPI功能的
[单片机]
【STC15库函数上手笔记】9、硬件<font color='red'>SPI</font>
SPI通信协议基础
引言 当您将微控制器连接到传感器,显示器或其他模块时,您是否考虑过这两种设备如何相互通信?他们到底在说什么?他们如何互相了解? 电子设备之间的通信就像人类之间的通信。双方都需要说相同的语言。在电子学中,这些语言称为 通信协议。对我们来说幸运的是,在构建大多数DIY电子产品项目时,我们只需要知道一些通信协议即可。 首先,我们将从有关电子通信的一些基本概念开始,然后详细说明SPI的工作原理。 SPI,I2C和UART比USB,以太网,蓝牙和WiFi等协议要慢很多,但它们更简单,使用的硬件和系统资源也更少。SPI,I2C和UART非常适用于微控制器之间以及不需要传输大量高速数据的微控制器与传感器之间的通信。 正文 串行与并行通信 电子设
[单片机]
<font color='red'>SPI</font>通信协议基础
同步串口spi的c语言编程
#include io8535v.h #include macros.h #define uchar unsigned char #define uint unsigned int uchar Table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Da ta ={0,0,0,0}; void DelayMs(uint i) {uchar j; for(;i!=0;i--) {for(j=2000;j!=0;j--) {;}} } void Display(uchar *p) {uchar i,sel=0x01; for(i=0;i 4;i++)
[单片机]
stm8s开发(七) SPI的使用:SPI主机通信!
  科普SPI:是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,分别是:SCK(时钟)、MOSI(主机发送数据)、MISO(主机接收数据)、NSS(片选),其中NSS的片选信号,大部分情况下我们使用的是软件NSS,即为使用一个GPIO进行软件控制片选。值得注意的是,其中SPI有4中模式:分别是空闲时SCLK的电平高低、MISO采样时第12个变化沿。   stm8s的SPI结构如下图,      如果用形象的比喻的话:SCK像一个发条齿轮,只有当发条齿轮转动的时候(SCK输出8个时钟),MOSI才能将1Byte的数据发送出去,同时,MISO将1Byte的数据接收回来。   使用SPI无非就一个初
[单片机]
stm8s开发(七) <font color='red'>SPI</font>的使用:<font color='red'>SPI</font>主机通信!
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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