SSP1922头文件
#ifndef _SSP1922_H_
#define _SSP1922_H_
#include "gd32f3x0_gpio.h"
#include "systick.h"
//#include "core_cmInstr.h"
extern uint8_t ALU_INT_FLAG;
//extern uint8_t count;
//TDC_RST -- PA1
//SPI_SCLK -- PA5
//SPI_MOSI -- PA7
//SPI_CS -- PB0
//EN_START -- PB3 //START信号使能
//TDC_INTN -- PA3 //ALU计算中断输入
//SPI_MISO -- PA6 //SPI数据输入
#define TDC_RST_H gpio_bit_set(GPIOA, GPIO_PIN_1)
#define TDC_RST_L gpio_bit_reset(GPIOA, GPIO_PIN_1)
#define SPI_SCLK_H gpio_bit_set(GPIOA, GPIO_PIN_5)
#define SPI_SCLK_L gpio_bit_reset(GPIOA, GPIO_PIN_5)
#define SPI_MOSI_H gpio_bit_set(GPIOA, GPIO_PIN_7)
#define SPI_MOSI_L gpio_bit_reset(GPIOA, GPIO_PIN_7)
#define SPI_CS_H gpio_bit_set(GPIOB, GPIO_PIN_0)
#define SPI_CS_L gpio_bit_reset(GPIOB, GPIO_PIN_0)
#define EN_START_H gpio_bit_set(GPIOB, GPIO_PIN_3)
#define EN_START_L gpio_bit_reset(GPIOB, GPIO_PIN_3)
#define SPI_MISO_IN gpio_input_bit_get(GPIOA, GPIO_PIN_6)
#define Init() Write_Order(0x70)
#define Power_on_Reset() Write_Order(0X50)
#define Start_TOF() Write_Order(0X01)
#define Start_Temp() Write_Order(0X02)
#define Start_Cal_Resonator() Write_Order(0X03)
#define Start_Cal_TDC() Write_Order(0X04)
#define Start_TOF_Restart() Write_Order(0X05)
#define Start_Temp_Restart() Write_Order(0X06)
void GPIO_Config(void);
void RST_TDC(void);
void SPI_Init(void);
void SPI_ENABLE(void);
void SPI_DISABLE(void);
void SEND_0(void);
void SEND_1(void);
void SPI_WRITE8(uint8_t wbuf8);
uint8_t SPI_READ8(void);
void SPI_WRITE32(uint32_t wbuf32);
uint32_t SPI_READ32(void);
uint16_t SPI_READ16(void);
void Write_Reg(uint8_t RegNum,uint32_t RegData);
uint32_t Read_Reg(uint8_t RegNum);
uint16_t Read_STAT(void);
uint8_t Read_PW1ST(void);
uint8_t Read_REG_1(void);
void Write_Order(uint8_t Order);
void ssp1922_Config(void);
SSP1922.c文件
#include "ssp1922.h"
uint8_t ALU_INT_FLAG;
void GPIO_Config(void)
{
//TDC_RST -- PA1
//SPI_SCLK -- PA5
//SPI_MOSI -- PA7
//SPI_CS -- PB0
//EN_START -- PB3 //START信号使能
//TDC_INTN -- PA3 //ALU计算中断输入
//SPI_MISO -- PA6 //SPI数据输入
rcu_periph_clock_enable(RCU_GPIOA);
/* configure led GPIO port */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1|GPIO_PIN_5|GPIO_PIN_7);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1|GPIO_PIN_5|GPIO_PIN_7);
rcu_periph_clock_enable(RCU_GPIOB);
/* configure led GPIO port */
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0|GPIO_PIN_3);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_3);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3|GPIO_PIN_6);
rcu_periph_clock_enable(RCU_CFGCMP);
/* enable and set key EXTI interrupt to the lowest priority */
nvic_irq_enable(EXTI2_3_IRQn, 0, 2);
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN3);
/* configure key EXTI line */
exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_3);
//TDC_RST -- PA1
//SPI_SCLK -- PA5
//SPI_MOSI -- PA7
//SPI_CS -- PB0
//EN_START -- PB3 //START信号使能
//TDC_INTN -- PA3 //ALU计算中断输入
//SPI_MISO -- PA6 //SPI数据输入
TDC_RST_H;
SPI_SCLK_L;
SPI_MOSI_L;
SPI_CS_H;
EN_START_L;
}
void RST_TDC(void)
{
TDC_RST_L;
delay_1ms(20);
TDC_RST_H;
EN_START_H;
}
void SPI_Init(void)
{
SPI_CS_H;
SPI_MOSI_L;
SPI_SCLK_L;
__NOP;
__NOP;
__NOP;
}
void SPI_ENABLE(void)
{
SPI_CS_L;
__NOP;
__NOP;
__NOP;
}
void SPI_DISABLE(void)
{
SPI_CS_L;
__NOP;
__NOP;
__NOP;
SPI_CS_H;
__NOP;
__NOP;
__NOP;
}
void SEND_0(void)
{
SPI_MOSI_L;
__NOP;
SPI_SCLK_H;
__NOP;
SPI_SCLK_L;
__NOP;
}
void SEND_1(void)
{
SPI_MOSI_H;
__NOP;
SPI_SCLK_H;
__NOP;
SPI_SCLK_L;
__NOP;
}
void SPI_WRITE8(uint8_t wbuf8)
{
uint8_t cnt,MSB8 = 0x80;
SPI_SCLK_L;
__NOP;
for(cnt = 8; cnt>0; cnt--)
{
if(wbuf8&MSB8)
{
SEND_1();
}
else
{
SEND_0();
}
wbuf8 <<= 1;
}
}
uint8_t SPI_READ8(void)
{
uint8_t cnt;
uint8_t LSB8 = 0x01;
uint8_t rbuf8 = 0x00;
SPI_SCLK_L;
__NOP;
for(cnt = 8; cnt > 0 ;cnt--)
{
rbuf8 <<= 1;
SPI_SCLK_H;
__NOP;
if(SPI_MISO_IN)
{
rbuf8 |= LSB8;
}
SPI_SCLK_L;
__NOP;
}
return rbuf8;
}
void SPI_WRITE32(uint32_t wbuf32)
{
uint8_t cnt;
uint32_t MSB32 = 0x80000000;
SPI_SCLK_L;
__NOP;
for(cnt=32;cnt>0;cnt--)
{
if(wbuf32 & MSB32)
SEND_1();
else
SEND_0();
wbuf32 <<= 1;
}
}
uint32_t SPI_READ32(void)
{
uint8_t cnt;
uint32_t LSB32 = 0x00000001;
uint32_t rbuf32 = 0x00000000;
SPI_SCLK_L;
__NOP;
for(cnt=32;cnt>0;cnt--)
{
rbuf32 <<=1;
SPI_SCLK_H;
__NOP;
if(SPI_MISO_IN)
{
rbuf32 |= LSB32;
}
SPI_SCLK_L;
__NOP;
}
return rbuf32;
}
uint16_t SPI_READ16(void)
{
uint8_t cnt;
uint16_t LSB16 = 0x0001;
uint16_t rbuf16 = 0x0000;
SPI_SCLK_L;
__NOP;
for(cnt=16;cnt>0;cnt--)
{
rbuf16 <<=1;
SPI_SCLK_H;
__NOP;
if( SPI_MISO_IN )
rbuf16 |= LSB16;
SPI_SCLK_L;
__NOP;
}
return rbuf16;
}
void Write_Reg(uint8_t RegNum,uint32_t RegData)
{
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0x80|RegNum);
SPI_WRITE32(RegData);
SPI_DISABLE();
}
uint32_t Read_Reg(uint8_t RegNum)
{
uint32_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB0|RegNum);
ReadData = SPI_READ32();
SPI_DISABLE();
return ReadData;
}
uint16_t Read_STAT(void)
{
uint16_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB4);
ReadData = SPI_READ16();
SPI_DISABLE();
return ReadData;
}
uint8_t Read_PW1ST(void)
{
uint8_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB8);
ReadData = SPI_READ8();
SPI_DISABLE();
return ReadData;
}
uint8_t Read_REG_1(void)
{
uint8_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB5);
ReadData = SPI_READ8();
SPI_DISABLE();
return ReadData;
}
void Write_Order(uint8_t Order)
{
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(Order);
SPI_DISABLE();
}
void ssp1922_Config(void)
{
uint32_t REG0,REG1,REG2,REG3,REG4,REG5,REG6;
REG0 = 0x00342400;
//bit31-bit28 ANZ_FIRE[3:0] = 0 关闭 设置fire端口发射的脉冲个数
//bit27-bit24 DIV_FIRE = 0 不分频 设置内部时钟信号产生脉冲的分频因数
//bit23-bit22 ANZ_PER_CALRES(CALRES#)
//bit10 = 1 STOP通道2下降沿
REG1 = 0x01490000; //上升沿测量 ALU = 1.Stop Ch1 - START
//REG1 = 0x09490000; //ALU = 1.Stop Ch2 - START 下降沿测量
// REG1 = 0x19490000; //ALU = 1.Stop Ch2 - 1.Stop Ch1 脉宽测量
//bit31-bit28 HIT2 = 0 = START HIT2 = 1 = 1.Stop Ch1
//bit27-bit24 HIT1 = 1 = 1.Stop Ch1 HIT1 = 9 = 1.Stop Ch2
//bit21-bit19 HITIN2 = 1 在STOP通道2的预期脉冲数 1=1个脉冲
//bit18-bit16 HITIN1 = 1 在STOP通道1的预期脉冲数 1=1个脉冲
REG2 = 0xA0000000;
//bit29 = 1 ALU中断触发位
REG3 = 0x00000000;
REG4 = 0x20000000;
//默认配置
REG5 = 0x08000000;
REG6 = 0x00200000;
Write_Reg(0,REG0);
Write_Reg(1,REG1);
Write_Reg(2,REG2);
Write_Reg(3,REG3);
Write_Reg(4,REG4);
Write_Reg(5,REG5);
Write_Reg(6,REG6);
}
mian函数
int main(void)
{
uint32_t res0 = 0x00;
uint8_t datbuf0=0x00,datbuf1=0x00,datbuf2=0x00,datbuf3=0x00;
uint8_t txdat[15];
uint32_t reg1 = 0x00;
uint16_t STAT = 0x00;
float time_float = 0;
uint32_t time_int = 0x00;
// uint8_t test_dat = 0x00;
systick_config();
txdat[0] = 0x5A;
txdat[1] = 0x03;
txdat[2] = 0x0A;
txdat[3] = 0x00;
txdat[4] = 0x0C;
usart0_init(); //串口0初始化
GPIO_Config(); //SSP1922IO初始化
RST_TDC(); //SSP1922复位
ssp1922_Config(); //SSP1922的7个寄存器配置
delay_1ms(10);
Init();
delay_1ms(1);
while(1){
//SPI通信测试 读配置寄存器RES1的高8位
// test_dat = Read_REG_1();
// usart0_send_ch(test_dat);
if(ALU_INT_FLAG == 1)
{
ALU_INT_FLAG = 0;
STAT = Read_STAT();
if((STAT & 0x0200) == 0x0000)
{
res0 = Read_Reg(0x00);
datbuf0 = (res0>>24) & 0xFF;
datbuf1 = (res0>>16) & 0xFF;
datbuf2 = (res0>>8) & 0xFF;
datbuf3 = res0 & 0xFF;
time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
time_int = (uint32_t)(time_float*100000);
datbuf0 = (time_int>>16) & 0xFF;
datbuf1 = (time_int>>8) & 0xFF;
datbuf2 = time_int & 0xFF;
txdat[5] = datbuf2;
txdat[6] = datbuf1;
txdat[7] = datbuf0;
reg1 = 0x09490000;
Write_Reg(1,reg1);
delay_1ms(1);
// delay_us(10);
res0 = Read_Reg(0x01);
datbuf0 = (res0>>24) & 0xFF;
datbuf1 = (res0>>16) & 0xFF;
datbuf2 = (res0>>8) & 0xFF;
datbuf3 = res0 & 0xFF;
time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
time_int = (uint32_t)(time_float*100000);
datbuf0 = (time_int>>16) & 0xFF;
datbuf1 = (time_int>>8) & 0xFF;
datbuf2 = time_int & 0xFF;
txdat[8] = datbuf2;
txdat[9] = datbuf1;
txdat[10] = datbuf0;
reg1 = 0x19490000;
Write_Reg(1,reg1);
delay_1ms(1);
// delay_us(10);
res0 = Read_Reg(0x02);
datbuf0 = (res0>>24) & 0xFF;
datbuf1 = (res0>>16) & 0xFF;
datbuf2 = (res0>>8) & 0xFF;
datbuf3 = res0 & 0xFF;
time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
time_int = (uint32_t)(time_float*100000);
datbuf0 = (time_int>>16) & 0xFF;
datbuf1 = (time_int>>8) & 0xFF;
datbuf2 = time_int & 0xFF;
txdat[11] = datbuf2;
txdat[12] = datbuf1;
txdat[13] = datbuf0;
txdat[14] = Check_Sum(&txdat[1],13);
uart0_Send_Array(txdat,15);
}
ssp1922_Config();
delay_1ms(10);
Init();
delay_1ms(1);
}
}
}
1035

被折叠的 条评论
为什么被折叠?



