195 lines
5.5 KiB
C
195 lines
5.5 KiB
C
/*
|
||
*********************************************************************************************************
|
||
* 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);
|
||
}
|
||
}
|