/* ********************************************************************************************************* * IAR Development Kits * on the * * Nano130 * * Filename : spi_flash.c * Version : V1.00 * Programmer(s) : Qian Xianghong ********************************************************************************************************* */ #include "includes.h" // 加速度计ID uint8_t Accelero_ID = 0; // 运动状态(默认为1,万一加速度计有问题) volatile uint8_t Motion_Status = 1; // 运动检测:第一次需要定位 volatile uint8_t Motion_Detected = 1; typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; //**************************************** // 定义LIS2DH12内部地址 //**************************************** #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 #define CTRL_REG6 0x25 #define ACT_THS 0x3E #define ACT_DUR 0x3F #define WHO_AM_I 0x0F //地址寄存器(默认数值0x33,只读) uchar Single_WriteSPI(uchar REG_Address,uchar REG_data) { SPI_SET_SS0_LOW(SPI2); // Write Address SPI_WRITE_TX0(SPI2, REG_Address & 0x3F); while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI2)); SPI_READ_RX0(SPI2); // Write data SPI_WRITE_TX0(SPI2, REG_data); while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI2)); SPI_READ_RX0(SPI2); SPI_SET_SS0_HIGH(SPI2); return 1; } uchar Single_ReadSPI(uchar REG_Address, uchar *REG_data) { SPI_SET_SS0_LOW(SPI2); // Read Address SPI_WRITE_TX0(SPI2, (REG_Address & 0x3F) | 0x80); while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI2)); SPI_READ_RX0(SPI2); // 提供Clock SPI_WRITE_TX0(SPI2, 0); while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI2)); *REG_data = SPI_READ_RX0(SPI2); SPI_SET_SS0_HIGH(SPI2); return 1; } // 读取运动状态 void Accelero_ReadStatus(uint8_t pf5) { // 当前运动状态 Motion_Status = !pf5; // Active low printf("\nHard Motion status = %d\n", Motion_Status); // 检测到了运动(需要重新定位) if(Motion_Status) Motion_Detected = 1; } void Accelero_Handler() { // 保存键值 uint8_t pf5 = PF5; if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk) { // 重新打开看门狗计数器 WDT->CTL |= WDT_CTL_WTE_Msk; } // 清除中断标志 GPIO_CLR_INT_FLAG(PF, BIT5); if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk) { // 清除中断唤醒标志 // CLK->WK_INTSTS |= CLK_WK_INTSTS_PD_WK_IS_Msk; Vcc_Enable(); delay_ms(40); Wakeup_Sleeping = 0; printf("\nWakeup by Accelero ...\n"); } // 读取运动状态 Accelero_ReadStatus(pf5); } // 加速度中断处理,本函数被【key.c】模块中【GPDEF_IRQHandler】函数调用 void Accelero_Init() { SYS->PD_L_MFP &= ~(SYS_PD_L_MFP_PD0_MFP_Msk | SYS_PD_L_MFP_PD1_MFP_Msk | SYS_PD_L_MFP_PD2_MFP_Msk | SYS_PD_L_MFP_PD3_MFP_Msk); SYS->PD_L_MFP |= (SYS_PD_L_MFP_PD0_MFP_SPI2_SS0 | SYS_PD_L_MFP_PD1_MFP_SPI2_SCLK | SYS_PD_L_MFP_PD2_MFP_SPI2_MISO0 | SYS_PD_L_MFP_PD3_MFP_SPI2_MOSI0); // 允许外设时钟 CLK_EnableModuleClock(SPI2_MODULE); SYS->PF_L_MFP &= ~SYS_PF_L_MFP_PF5_MFP_Msk; SYS->PF_L_MFP |= SYS_PF_L_MFP_PF5_MFP_GPF5; GPIO_SetMode(PF, BIT5, GPIO_PMD_INPUT); // INT2 // 硬件防抖:在key.c中设置 GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_IRC10K, GPIO_DBCLKSEL_256); // GPIO_ENABLE_DEBOUNCE(PF, BIT5); } // 初始化LIS2DH12 void Accelero_Open() { /*---------------------------------------------------------------------------------------------------------*/ /* Init SPI */ /*---------------------------------------------------------------------------------------------------------*/ /* Configure SPI2 as a master, SPI clock rate 8 MHz, clock idle low, 8-bit transaction, drive output on falling clock edge and latch input on rising edge. */ SPI_Open(SPI2, SPI_MASTER, SPI_MODE_0, 8, 8000000ul); /* Disable the automatic hardware slave selection function. */ SPI_DisableAutoSS(SPI2); SPI_SET_MSB_FIRST(SPI2); /* Set TX FIFO threshold, enable TX FIFO threshold interrupt and RX FIFO time-out interrupt */ SPI_EnableFIFO(SPI2, 1, 1); // 打开中断:在key.c中设置 // NVIC_SetPriority (GPDEF_IRQn, 2); // NVIC_EnableIRQ(GPDEF_IRQn); /* Interrupt Type: Both Edge */ if(dcBuff.configDisplay.op_BOX_VER || dcBuff.configDisplay.op_SEND_GPS_DATA) GPIO_EnableInt(PF, 5, GPIO_INT_BOTH_EDGE); Single_WriteSPI(CTRL_REG1, 0x5F); //控制寄存器,(100Hz, Low-power mode,Enable XYZ) Single_WriteSPI(CTRL_REG2, 0x00); //控制寄存器,(High-pass filter disabled) Single_WriteSPI(CTRL_REG3, 0x00); //控制寄存器 Single_WriteSPI(CTRL_REG4, 0x00); //控制寄存器,(4-wire SPI,Self-test disabled, HR=0, FS= ±2g) Single_WriteSPI(CTRL_REG5, 0x00); //控制寄存器,(FIFO disabled) Single_WriteSPI(CTRL_REG6, 0x08); //控制寄存器,(Enable activity interrupt on INT2 pin) // Activate/Inactivate: 门限寄存器,(x 4g/250 mg) if(dcBuff.configDisplay.op_SEND_GPS_DATA) // 槽车最灵敏,只在行驶过程中判断 Single_WriteSPI(ACT_THS, 4); else // 罐箱 Single_WriteSPI(ACT_THS, 20); // Activate/Inactivate: 持续时间寄存器 Single_WriteSPI(ACT_DUR, 40); // 读出ID:测试通信是否正常 Accelero_CheckID(); } // 读出ID放在Accelero_ID(检查加速度计是否正常) void Accelero_CheckID() { // 读出ID:测试通信是否正常 Single_ReadSPI(WHO_AM_I, &Accelero_ID); printf("\nAccelero ID = 0x%02X\n", Accelero_ID); if(Accelero_ID == ACCELERO_ID) { Motion_Status = !PF5; printf("\nInit Motion status = %d\n", Motion_Status); } }