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

📄 tdc_gp2.c

📁 msp430与TDC-GP2的Spi口通信程序
💻 C
字号:

#include<msp430x13x.h>
#include"Global.h"




/*-----------定义TDC-GP2端口-----------*/

//SPI通讯端口定义
#define SPI_SSN_SET   P3OUT|=BIT0;
#define SPI_SSN_CLR   P3OUT&=~(BIT0);
#define SPI_SI_SET    P3OUT|=BIT2;
#define SPI_SI_CLR    P3OUT&=~(BIT2);
#define SPI_SCK_SET   P3OUT|=BIT3;
#define SPI_SCK_CLR   P3OUT&=~(BIT3);
//#define SPI_SO        ((P3IN&BIT1)==0x02); 
//P3.1为TDC的SPI数据输出
//P1.4为TDC的中断信号输出位

//TDC_GP2复位
#define TDC_RSTN_SET      P2OUT|=BIT7;
#define TDC_RSTN_CLR      P2OUT&=~(BIT7);


/*

//以下端口定义用于测试
#define SPI_SSN_SET   P3OUT|=BIT7;
#define SPI_SSN_CLR   P3OUT&=~(BIT7);
#define SPI_SI_SET    P3OUT|=BIT5;
#define SPI_SI_CLR    P3OUT&=~(BIT5);
#define SPI_SCK_SET   P3OUT|=BIT4;
#define SPI_SCK_CLR   P3OUT&=~(BIT4);

#define TDC_RSTN_SET      P4OUT|=BIT0;
#define TDC_RSTN_CLR      P4OUT&=~(BIT0);



*/





//TDC控制端口定义
#define TDC_START_SET P6OUT|=BIT3;
#define TDC_START_CLR P6OUT&=~(BIT3);

#define TDC_STOP_SET P6OUT|=BIT4;//STOP1
#define TDC_STOP_CLR P6OUT&=~(BIT4);

//START使能,高电平有效
#define TDC_ENSTART_SET P6OUT|=BIT5;
#define TDC_ENSTART_CLR P6OUT&=~(BIT5);
//STOP1使能,高电平有效
#define TDC_ENSTOP1_SET P6OUT|=BIT6;
#define TDC_ENSTOP1_CLR P6OUT&=~(BIT6);
//STOP2使能,高电平有效
#define TDC_ENSTOP2_SET P6OUT|=BIT7;
#define TDC_ENSTOP2_CLR P6OUT&=~(BIT7);
/*-------------------------------------*/




/*--------------TDC_GP2端口初始化--------------*/
void GP2_port_init(void) //端口初始化
{
  
  P6DIR|=BIT3;          //START  输出方向
      P6OUT&=~(BIT3);   //上电输出为低
  P6DIR|=BIT4;          //STOP1  输出,测试用
      P6OUT&=~(BIT4);   //上电输出为低
       
  
  P6DIR|=BIT5;         //EN_START  输出方向
      P6OUT&=~(BIT5);
  P6DIR|=BIT6;         //EN_STOP1  输出方向
      P6OUT&=~(BIT6);
  P6DIR|=BIT7;         //EN_STOP2  输出方向
      P6OUT&=~(BIT7);
  
  P2DIR|=BIT7;         //RSTN 输出方向
  
  P3DIR|=BIT0;         //SSN-输出方向
  P3DIR|=BIT2;         //GP2_SI口     输出方向
  P3DIR&=~(BIT1);      //GP2_SO口     输入方向
  P1DIR&=~(BIT4);      //GP2中断信号    输入方向
  P3DIR|=BIT3;         //SCK-输出方向
  
  
  
  P3DIR|=BIT4;
 // P3OUT&=~(BIT3);
  
  
  //P6DIR|=BIT4;    //测试口
 /* 
  P3DIR|=BIT4;
  P3DIR|=BIT5;

  P3DIR|=BIT7;
  */
  
  SPI_SCK_CLR;//SCK---空闲时低平,spi 时钟极性为0。
  SPI_SSN_SET;//SSN---片选在没有通信情况下置高
  TDC_RSTN_CLR;
}


/*------------------SPI写数据-------------------*/


void spi_write8(unsigned char data_buf_8) // spi 写入8 位数据
{
  unsigned char cnt;
  //unsigned char tmp=0x80;
  SPI_SSN_CLR;
  
  for(cnt=8;cnt>0;cnt--)
    {
      SPI_SCK_SET; 
      if((data_buf_8&0x80)==0)
      {//发送0    
        SPI_SI_CLR;           
      }
      else
      {//发送1 
        SPI_SI_SET;          
      }
      SPI_SCK_CLR;
      //tmp>>1; //tmp 右移一位
      data_buf_8=(data_buf_8<<1);
    }   
  
   SPI_SSN_SET;  
   return;
}


void spi_write32(unsigned long  data_buf_32) // spi 写32 位数据
{
  unsigned char cnt;
  //unsigned long tmp=0x80000000;
  SPI_SSN_CLR;  
  
  for(cnt=32;cnt>0;cnt--)
    {
      SPI_SCK_SET;
      if((data_buf_32&0x80000000)==0)
      {//发送0        
        SPI_SI_CLR;
      }
      else
      {//发送1
        SPI_SI_SET;
      }
      SPI_SCK_CLR;
     // tmp>>1; //tmp 右移一位
      data_buf_32=(data_buf_32<<1);
    }
  
   SPI_SSN_SET;
   return;
}
//============================================//



//=====================SPI 读数据=====================//
void spi_write_com(unsigned char temp)
{
  unsigned char cnt;  
  for(cnt=8;cnt>0;cnt--)
    {
      SPI_SCK_SET;
      if((temp&0x80)==0)
      {//发送0       
        SPI_SI_CLR;             
      }
      else
      {//发送1      
        SPI_SI_SET;               
      }
      SPI_SCK_CLR;
     // tmp>>1; //tmp 右移一位
      temp=(temp<<1);
    }      
   return;
}


//------读取16位数据
unsigned int spi_read16(void)
{

  unsigned char cnt;
  unsigned int tmp=0x8000;
  unsigned int Data_16_tmp=0x0000;
  
    for(cnt=16;cnt>0;cnt--)
    {
      SPI_SCK_SET;
      _NOP();
      if((P3IN&BIT1)>0x00)
        data_0|=tmp;
      
      tmp=(tmp>>1);//tmp 右移一位
      SPI_SCK_CLR;
      _NOP();
    }
  
  return(Data_16_tmp);
}

//------读取32位数据
unsigned long spi_read32(unsigned char addr)
{

  unsigned char cnt;
  unsigned long tmp=0x80000000; 
  unsigned long Data_32_tmp=0x00000000;
   
  spi_write_com(addr);
    for(cnt=32;cnt>0;cnt--)
    {
      SPI_SCK_SET;
      _NOP();
      if((P3IN&BIT1)>0x00)
        data_0|=tmp;
      
      tmp=(tmp>>1);//tmp 右移一位
      SPI_SCK_CLR;
      _NOP();
    }
   
  
  return(Data_32_tmp);
}
//============================================//


void read_result(char addr)
{
  /*------------------------------------------------
    addr为0xb0   测量结果寄存器1
    addr为0xb1   测量结果寄存器2
    addr为0xb2   测量结果寄存器3
    addr为0xb3   测量结果寄存器4
    Data_buffer_H 数据输出高十六位 在全局变量中定义
    Data_buffer_l 数据输出低十六位 在全局变量中定义
  -------------------------------------------------*/
  
  SPI_SSN_CLR;   
  spi_write_com(addr); 
  Data_buffer_H=spi_read16();
  Data_buffer_l=spi_read16();  
  SPI_SSN_SET;

}



//===========GP2 上电复位程序==================//
void GP2_RESET(void)
{
  TDC_RSTN_SET;
  _NOP();
  TDC_RSTN_CLR;
  _NOP();
  _NOP();
  _NOP();
  TDC_RSTN_SET;
}//给TDC_GP2 RSTN管脚一个Reset的方波
//=============================================//





//===========GP2寄存器配置程序====================//
void GP2_init(void)
{
  unsigned long REG0,REG1,REG2, REG3, REG4,REG5;
 
  //unsigned char init=0x70;
  REG0=0x80002426;
  REG1=0x81194900;
  REG2=0x82800000;
  REG3=0x83180000;
  REG4=0x84200000;
  REG5=0x85080000;
  
  spi_write8(0x50);//上电复位
  SPI_SSN_CLR;
  _NOP();
  spi_write32(REG0);
  _NOP();
  spi_write32(REG1);
  _NOP();
  spi_write32(REG2);
  _NOP();
  spi_write32(REG3);
  _NOP();
  spi_write32(REG4);
  _NOP();
  spi_write32(REG5);
  _NOP();
  spi_write8(0x70);
  SPI_SSN_SET;
  return;
}
//===============================================//



//===============GP2 时钟校准程序================//
unsigned long GP2_cal(void)
{
  unsigned char cal_start=0x03;
  unsigned char read_reg0=0xb0;
  unsigned long CAL=0X00000000;
  //float CAL_f;
  TDC_ENSTART_SET;//EN_START
  spi_write8(cal_start);//启动校准
  _NOP();
  SPI_SSN_CLR;
  
  while((P1IN&0x10)==0x10)//判断中断置位否
    _NOP();
  CAL=spi_read32(read_reg0);
    _NOP();
  SPI_SSN_SET; 
  return(CAL);
}
//===============================================//


//==========时间测量状态寄存器判断程序===========//
unsigned char GP2_TMSTAT()
{

  if((P1IN&0x10)==0x10)//判断中断置位否
    _NOP();
  else
  {
    SPI_SSN_CLR;
    spi_write_com(0xb4);
    STAT=spi_read16();
    SPI_SSN_SET;
  }
}


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


//------------用单片机口产生START 信号-----------//
void GP2_START(void)
{
 // TDC_ENSTART_SET;//START
  TDC_START_CLR;
  _NOP();
  TDC_START_SET;
  _NOP();
  TDC_START_CLR;
  //TDC_ENSTART_CLR;//START
  return;
}
//---------------------------------//


//------------通讯测试-------------//  
unsigned char testcomunication(void)
{
  unsigned long int REG1;
  unsigned char cnt;
  unsigned char tmp=0x80;
  //unsigned char test_reg=0xb5; //读结果寄存器5,反映寄存器1 的高8 位
  unsigned char test_reg0=0x00;
  
  TDC_ENSTART_SET;
  _NOP();
 
  SPI_SSN_CLR;
  REG1=0x81f10100; //写寄存器1,随便输入,然后从结果寄存器5 读高8 位
  spi_write32(REG1) ;
  SPI_SSN_SET;
  
  
  SPI_SSN_CLR;
  spi_write_com(0xb5);
  for(cnt=8;cnt>0;cnt--)
  {
    SPI_SCK_SET;
    _NOP();
    if((P3IN&BIT1)>0x00)
      test_reg0|=tmp;
    
    tmp=(tmp>>1);
    SPI_SCK_CLR;
    _NOP();
   } 
  SPI_SSN_SET;
  
  if(test_reg0==0xf1)
    return(1);
  else
    return(0);
}
//===================================//



//======时间测量测试=========//
void timemeasurement(void)
{
  TDC_ENSTART_SET;//EN_START
  TDC_ENSTOP1_SET;//EN_STOP1
  TDC_ENSTOP2_SET;//EN_STOP2
    _NOP();
    _NOP();
    _NOP();
    _NOP(); 
   P6OUT|=BIT3;
   P6OUT&=~(BIT3);//向TDC发送开始信号 
   //P6OUT|=BIT4;
   //P6OUT&=~(BIT4); //截止信号
    
  if((P1IN&0x10)==0x10)//判断TDC中断
    {
      _NOP();
    }
   
   TDC_ENSTART_CLR;//EN_START
   TDC_ENSTOP1_CLR;//EN_STOP1
   TDC_ENSTOP2_CLR;//EN_STOP2
  
}
//===========================================//




⌨️ 快捷键说明

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