?? tdc_gp2.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 + -