#include "DSP28_Device.h" <br />unsigned int Spi_VarRx[100]; <br />unsigned int i,j; <br />#define WHO_AM_I 0x0f <br />#define OFFSET_X 0x16 <br />#define OFFSET_Y 0x17 <br />#define OFFSET_Z 0x18 <br />#define GAIN_X 0x19 <br />#define GAIN_Y 0x1a <br />#define GAIN_Z 0x1b <br />#define CTRL_REG1 0x20 <br />#define CTRL_REG2 0x21 <br />#define CTRL_REG3 0x22 <br />#define HP_FILTER_RESET 0x23 <br />#define STATUS_REG 0x27 <br />#define OUTX_L 0x28 <br />#define OUTX_H 0x29 <br />#define OUTY_L 0x2a <br />#define OUTY_H 0x2b <br />#define OUTZ_L 0x2c <br />#define OUTZ_H 0x2d <br />#define FF_WU_CFG 0x30 <br />#define FF_WU_SRC 0x31 <br />#define FF_WU_ACK 0x32 <br />#define FF_WU_THS_L 0x34 <br />#define FF_WU_THS_H 0x35 <br />#define FF_WU_DURATION 0x36 <br />#define DD_CFG 0x38 <br />#define DD_SRC 0x39 <br />#define DD_ACK 0x3a <br />#define DD_THSI_L 0x3c <br />#define DD_THSI_H 0x3d <br />#define DD_THSE_L 0x3e <br />#define DD_THSE_H 0x3f <br /><br />void delay_loop(void); <br />void spi_init(void); <br />void spi_xmit(int a); <br />int spi_rev(); <br />void spi_fifo_init(void); <br />void Lis3lv02dq_init(void); <br />int read_LIS_register( unsigned char register_name); <br />void write_LIS_register(unsigned char register_name, unsigned char register_value); <br />void Lis3lv02dq_init(void); <br />void LIS_read_x(unsigned int *x); <br />void LIS_read_y(unsigned int *y); <br />void LIS_read_z(unsigned int *z); <br />void read_LIS_x_y_z(unsigned int *x, unsigned int *y, unsigned int *z); <br /><br />unsigned int var1=0; <br />unsigned int var2=0; <br />unsigned int var3=0; <br />unsigned int Test_count=0; <br />unsigned int Test_flag1=0; <br />unsigned int Test_flag2=0; <br />unsigned int Test_flag3=0; <br />unsigned int Test_flag4=0; <br />unsigned int Test_var=0; <br />unsigned int Test_status[32]; <br />unsigned int PASS_flag=0; <br />unsigned int Ret_var1=0; <br />unsigned int Ret_var2=0; <br />int ID_Lis3lv02dq; <br />//interrupt void ISRSciaTx(void); <br />//interrupt void ISRSciaRx(void); <br />#define LED0_ON GpioDataRegs.GPFDAT.bit.GPIOF6=1 <br />#define LED0_OFF GpioDataRegs.GPFDAT.bit.GPIOF6=0 <br />#define LED1_ON GpioDataRegs.GPFDAT.bit.GPIOF7=1 <br />#define LED1_OFF GpioDataRegs.GPFDAT.bit.GPIOF7=0 <br /><br />void main(void) <br />{ <br />/*初始化系统*/ <br />InitSysCtrl(); <br />/* 关中断 */ <br />DINT; <br />IER = 0x0000; <br />IFR = 0x0000; <br />/* 初始化PIE控制寄存器 */ <br />InitPieCtrl(); <br />/* 初始化PIE参数表 */ <br />InitPieVectTable(); <br />/* 初始化外设寄存器 */ <br />InitPeripherals(); <br /><br /><br />//Step4,使用特定的函数重新分配向量使能中断 <br />spi_fifo_init(); // 初始化Spi FIFO <br /><br />spi_init(); //设置SPI工作模式,SPI初始化 <br /><br />Lis3lv02dq_init(); //加速度计Lis3lv02dq初始化 <br /><br />// write_LIS_register(CTRL_REG1,0xD7); //写加速度计地址20h,使加速度计从休眠模式唤醒(D7),160khz采样频率,使能xyz轴 <br /><br />ID_Lis3lv02dq = read_LIS_register(WHO_AM_I); //读取LIS的ID号 <br /><br />read_LIS_x_y_z(&var1,&var2,&var3); <br /><br />LED0_OFF; <br />for(;; <br /><br />} <br /><br />//Step5,所有中断服务程序和函数 <br />void delay_loop() <br />{ <br />long i; <br />for (i=0;i<1000000;i++){} <br />} <br /><br />//测试1,SPI 8位字符,自测试,主模式,上升沿,波特率设置0x07F <br />void spi_init() <br />{ <br />SpiaRegs.SPICCR.all=0x0007; //bit6~SPI复位,设置时钟为上升沿传输数据,8位字符长度 <br />SpiaRegs.SPICTL.all=0x0006; // bit2使能主模式,标准相位 <br />// bit1使能Talk(使能发送,对于4引脚选项,保证使能接 <br />//收器的spiste引脚),SPIINT屏蔽(bit0) <br />SpiaRegs.SPIBRR = 0x7C; //300KHZ设置波特率 <br /><br />//Step2,配置芯片的通用数字I/O为希望的功能引脚 <br />EALLOW; <br />GpioMuxRegs.GPFMUX.all=0x000F; //设置GPIO工作在SPI的功能 <br />//Port F MUX-x000 0000 0000 1111 <br />EDIS; <br /><br />//退出复位状态 <br />SpiaRegs.SPICCR.all=0x0087; //使SPI(正常工作状态),设置时钟为上升沿传输数据,8位字符长度 <br />// SpiaRegs.SPICCR.all=0x0097; //使能SPI自测试模式bit4,sIMO/SOMI线路被内部连接在一起,用于自测试 <br />} <br /><br /><br />void spi_fifo_init() <br />{ <br />//初始化SPI FIFO寄存器 <br />SpiaRegs.SPIFFTX.all=0xE040; <br />SpiaRegs.SPIFFRX.all=0x204F; <br />SpiaRegs.SPIFFCT.all=0x0; <br />} <br /><br /><br /><br />//发送一个读指令到加速度传感器 <br />int read_LIS_register( unsigned char register_name) <br />{ <br />int Rev_data; <br />int Tx_data =(register_name | 0x0080)<<8; <br />SpiaRegs.SPICTL.bit.TALK=0; //spiste引脚高阻 <br /><br />spi_xmit(Tx_data); //发送读取register_name指令,后8位位空操作指令 <br />SpiaRegs.SPICTL.bit.TALK=1; //spiste引脚拉低 <br /><br />if(SpiaRegs.SPISTS.bit.INT_FLAG == 1) //读命令传输完成,数据可读 <br />{ <br />int Rev_data = spi_rev(); //接收数据 <br />} <br /><br />return(Rev_data); //返回读取到数据 <br />} <br /><br />//发送一个写指令到加速度传感器 <br />void write_LIS_register(unsigned char register_name, unsigned char register_value) <br />{ <br />int Tx_data =(register_name & 0x007F)<<8 + register_value ; <br /><br />SpiaRegs.SPICTL.bit.TALK=0; //spiste引脚高阻 <br /><br />spi_xmit(Tx_data); //发送写register_name指令,后8位为写该寄存器的值 <br /><br />SpiaRegs.SPICTL.bit.TALK=1; //spiste引脚拉低 <br /><br />while(!SpiaRegs.SPISTS.bit.BUFFULL_FLAG ) //确认字节已经移位到SPODAT <br />continue; <br />} <br /><br />//SPI发送 <br />void spi_xmit(int a) <br />{ <br />SpiaRegs.SPITXBUF=a; //向SPI发送缓冲写数据 <br />} <br /><br />//SPI接收 <br />int spi_rev() <br />{ <br />return SpiaRegs.SPIRXBUF; //读SPI接收缓冲数据 <br />} <br /><br />//加速度计Lis3lv02dq初始化 <br />void Lis3lv02dq_init(void) <br />{ <br />unsigned char id; <br />unsigned int w; <br /><br />write_LIS_register(CTRL_REG1, 0xD7); //设置采样率,160khz。正常工作模式 <br />delay_loop(); <br />write_LIS_register(CTRL_REG2, 0x14); //从内flash校准参数,如X/Y/Z轴的偏移量和增益, <br />//调整到出厂设置,调往boot位置o <br />delay_loop(); <br />write_LIS_register(CTRL_REG1, 0xD7); //设置采样率,160khz。正常工作模式 <br />delay_loop(); <br />write_LIS_register(CTRL_REG2, 0x44); //读取完高字节后数据更新,确保数据传输正确, 使能数据更新信号 <br /><br /><br />id = read_LIS_register(OFFSET_X); //读取X轴加速度偏移量 <br />printf(" 0x%x ", id); <br />id = read_LIS_register(OFFSET_Y); //读取Y轴加速度偏移量 <br />printf(" 0x%x ", id); <br />id = read_LIS_register(OFFSET_Z); //读取Z轴加速度偏移量 <br />printf(" 0x%x ", id); <br />id = read_LIS_register(GAIN_X); //读取X轴加速度增益 <br />printf(" 0x%x ", id); <br />id = read_LIS_register(GAIN_Y); //读取Y轴加速度增益 <br />printf(" 0x%x ", id); <br />id = read_LIS_register(GAIN_Z); //读取Z轴加速度增益 <br />printf(" 0x%x ", id); <br />write_LIS_register(CTRL_REG1, 0xD7); //写CTRL_REG1工作状态,正常工作 <br />id = read_LIS_register(CTRL_REG1); <br />printf(" 0x%x ", id); <br />id = read_LIS_register(CTRL_REG2); //读取CTRL_REG2 <br />printf(" 0x%x ", id); <br /><br />LIS_read_x(&w); //读取X轴加速度 <br />LIS_read_y(&w); //读取Y轴加速度 <br />LIS_read_z(&w); //读取Z轴加速度 <br />} <br /><br /><br />//读取X轴加速度 <br />void LIS_read_x(unsigned int *x) <br />{ <br />unsigned char low, high; <br /><br />low = read_LIS_register(0x28); <br />high = read_LIS_register(0x29); <br />//printf(" 0x%x ", high); <br />*x = (((unsigned int)high)<< | low; <br />} <br /><br />//读取Y轴加速度 <br />void LIS_read_y(unsigned int *y) <br />{ <br />unsigned char low, high; <br /><br />low = read_LIS_register(0x2A); <br />high = read_LIS_register(0x2B); <br />*y = (((unsigned int)high)<< | low; <br />} <br /><br />//读取Z轴加速度 <br />void LIS_read_z(unsigned int *z) <br />{ <br />unsigned char low, high; <br /><br />low = read_LIS_register(0x2C); <br />high = read_LIS_register(0x2D); <br />*z = (((unsigned int)high)<< | low; <br />} <br /><br /><br /><br /><br />void read_LIS_x_y_z(unsigned int *x, unsigned int *y, unsigned int *z) <br />{ <br />LIS_read_y(y); <br />LIS_read_z(z); <br />LIS_read_x(x); <br />} <br /><br />//=========================================================================== <br />// No more. <br />//=========================================================================== |
|