⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 msp430中spi接口的使用程序。希望该历程能够为大家提供一些指导。
💻 C
字号:
#include <MSP430x12x2.h>
#include "SPI.h"
#include "define.h"
//*************************************************************//
//SPI的初始化;
//SPI的接收采用中断方式,发送采用查询方式;
/**************************************************************/
void Init_SPI(void)
  {
  WDTCTL =WDTPW+WDTHOLD;       //关闭看门狗;
  ME2  |=USPIE0;               //SPI0模块使能;
  U0CTL  =0X00;                //寄存器的内容清零;
  U0CTL  =CHAR+SYNC+MM+SWRST;  //8位SPI,主模式;
  U0TCTL =0X00;                //寄存器的内容清零;
  U0TCTL =SSEL1+SSEL0+STC;     //时钟源为SMCLK,3线模式;
  UBR0_0 =0X02;
  UBR1_0 =0X00;                //传输的时钟为SMCLK/4;
  UMCTL_0=0X00;                //调整寄存器没有调整;
  U0CTL &= ~SWRST;             //SPI使能;
  IE1   &=!UTXIE0;             //发送中断关闭;
  IE1   |=URXIE0;              //接收中断使能;
  _EINT();                     //使能总中断;
  }
/**************************************************************/
//用SPI接口向Zigbee的一个地址发送一个或者多个字节的数据;
//addr表示发送数据的目的地址;
//n表示发送数据的字节数;
//*data表示存放发送数据的数组的指针;
//发送的时候先发高8位
/**************************************************************/
void SPI_Write(uchar addr,uchar n,uchar *data)
  {
     uchar temp;
     TXBUF0= addr&0x3f;               //发送header;
     for(temp=0;temp<n;n++)
       {
       //查IFG1与IFG2的区别?
       TXBUF0= data[temp];            //发送第一个字节;
       while ((IFG1 & UTXIFG0) == 0); //检查发送的数据是否准备好;
       }
  }
/**************************************************************/
/*************从zigbee的某一地址中读出数据*************/
//数据的读取采用中断方式;
//addr表示要读取的地址;
//读取的数据存放在Read_Data[2]中;
/**************************************************************/
void SPI_Read(uchar addr)
  {
   uchar temp;
   Rece_Len=2;             //读取数据的个数;
   TXBUF0=addr&0x3f|0x80;  //发送header;
   while ((IFG1 & UTXIFG0) == 0);
   for(temp=0;temp<Rece_Len;Rece_Len++)
     {
      TXBUF0=addr;         //发送地址信息;
      while ((IFG2 & UTXIFG0) == 0);
     }
   while(1)
     {
      if(Rece_Complete)
        {
          Rece_Complete=0;
          break;
        }
     }
  }
/**************************************************************/
//SPI接收中断服务程序;
/**************************************************************/
#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx (void)
  {
    while ((IFG2 & UTXIFG0) == 0);            // 检查数据是否发送完成;
    Rece_buf[Rece_buf_Len]=RXBUF0;
    Rece_buf_Len++;
    if(Rece_buf_Len>=Rece_Len)                // 数据接收完成,长度清零;接收完成标志为置1.
      {
       Rece_Len=0;
       Rece_buf_Len=0;
       Rece_Complete=1;
      }
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -