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"
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ٶȼ<D9B6>ID
|
|||
|
|
uint8_t Accelero_ID = 0;
|
|||
|
|
// <20>˶<EFBFBD>״̬<D7B4><CCAC>Ĭ<EFBFBD><C4AC>Ϊ1<CEAA><31><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣩
|
|||
|
|
volatile uint8_t Motion_Status = 1;
|
|||
|
|
// <20>˶<EFBFBD><CBB6><EFBFBD><EFBFBD>⣺<EFBFBD><E2A3BA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λ
|
|||
|
|
volatile uint8_t Motion_Detected = 1;
|
|||
|
|
|
|||
|
|
typedef unsigned char uchar;
|
|||
|
|
typedef unsigned short ushort;
|
|||
|
|
typedef unsigned int uint;
|
|||
|
|
|
|||
|
|
//****************************************
|
|||
|
|
// <20><><EFBFBD><EFBFBD>LIS2DH12<31>ڲ<EFBFBD><DAB2><EFBFBD>ַ
|
|||
|
|
//****************************************
|
|||
|
|
#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 //<2F><>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>(Ĭ<><C4AC><EFBFBD><EFBFBD>ֵ0x33<33><33>ֻ<EFBFBD><D6BB>)
|
|||
|
|
|
|||
|
|
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);
|
|||
|
|
|
|||
|
|
// <20>ṩ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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD>˶<EFBFBD>״̬
|
|||
|
|
void Accelero_ReadStatus(uint8_t pf5)
|
|||
|
|
{
|
|||
|
|
// <20><>ǰ<EFBFBD>˶<EFBFBD>״̬
|
|||
|
|
Motion_Status = !pf5; // Active low
|
|||
|
|
printf("\nHard Motion status = %d\n", Motion_Status);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><E2B5BD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>¶<EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
if(Motion_Status)
|
|||
|
|
Motion_Detected = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Accelero_Handler()
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
uint8_t pf5 = PF5;
|
|||
|
|
|
|||
|
|
if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>´<C2B4><F2BFAABF>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
WDT->CTL |= WDT_CTL_WTE_Msk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|||
|
|
GPIO_CLR_INT_FLAG(PF, BIT5);
|
|||
|
|
|
|||
|
|
if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
|
|||
|
|
// CLK->WK_INTSTS |= CLK_WK_INTSTS_PD_WK_IS_Msk;
|
|||
|
|
|
|||
|
|
Vcc_Enable();
|
|||
|
|
delay_ms(40);
|
|||
|
|
Wakeup_Sleeping = 0;
|
|||
|
|
|
|||
|
|
printf("\nWakeup by Accelero ...\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD>˶<EFBFBD>״̬
|
|||
|
|
Accelero_ReadStatus(pf5);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ٶ<EFBFBD><D9B6>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key.c<><63>ģ<EFBFBD><C4A3><EFBFBD>С<EFBFBD>GPDEF_IRQHandler<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
// Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_IRC10K, GPIO_DBCLKSEL_256);
|
|||
|
|
// GPIO_ENABLE_DEBOUNCE(PF, BIT5);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>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);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>key.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 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); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100Hz<48><7A> Low-power mode<64><65>Enable XYZ<59><5A>
|
|||
|
|
Single_WriteSPI(CTRL_REG2, 0x00); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>High-pass filter disabled<65><64>
|
|||
|
|
Single_WriteSPI(CTRL_REG3, 0x00); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>
|
|||
|
|
Single_WriteSPI(CTRL_REG4, 0x00); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-wire SPI<50><49>Self-test disabled, HR=0, FS= <20><>2g<32><67>
|
|||
|
|
Single_WriteSPI(CTRL_REG5, 0x00); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO disabled<65><64>
|
|||
|
|
Single_WriteSPI(CTRL_REG6, 0x08); //<2F><><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Enable activity interrupt on INT2 pin<69><6E>
|
|||
|
|
|
|||
|
|
// Activate/Inactivate: <20><><EFBFBD>Ĵ<DEBC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x 4g/250 mg<6D><67>
|
|||
|
|
if(dcBuff.configDisplay.op_SEND_GPS_DATA) // <20>۳<EFBFBD><DBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ʻ<EFBFBD><CABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
Single_WriteSPI(ACT_THS, 4);
|
|||
|
|
else // <20><><EFBFBD><EFBFBD>
|
|||
|
|
Single_WriteSPI(ACT_THS, 20);
|
|||
|
|
// Activate/Inactivate: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
Single_WriteSPI(ACT_DUR, 40);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Accelero_CheckID();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD>Accelero_ID(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void Accelero_CheckID()
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|