NANO130_H2Press/User/spi_accelero.c

195 lines
5.5 KiB
C
Raw Normal View History

2025-04-10 14:54:41 +08:00
/*
*********************************************************************************************************
* 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);
}
}