📄 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 + -