MS-DTU/Anjiehui7_TTS_ST_V2.4_LOCAL/User/spi_accelero.c

244 lines
7.1 KiB
C
Raw Normal View History

2025-04-03 14:18:58 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* Nano130
*
* Filename : spi_flash.c
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#include "includes.h"
// Ƭѡ
#define LIS2DH12_CS_LOW() LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12)
#define LIS2DH12_CS_HIGH() LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_12)
// <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)
{
LIS2DH12_CS_LOW();
// Write Address
*(__IO uint8_t *)&SPI2->DR = (REG_Address & 0x3F);
while(!(SPI2->SR & SPI_SR_RXNE));
*(__IO uint8_t *)&SPI2->DR;
// Write data
*(__IO uint8_t *)&SPI2->DR = REG_data;
while(!(SPI2->SR & SPI_SR_RXNE));
*(__IO uint8_t *)&SPI2->DR;
LIS2DH12_CS_HIGH();
return 1;
}
uchar Single_ReadSPI(uchar REG_Address, uchar *REG_data)
{
LIS2DH12_CS_LOW();
// Read Address
*(__IO uint8_t *)&SPI2->DR = ((REG_Address & 0x3F) | 0x80);
while(!(SPI2->SR & SPI_SR_RXNE));
*(__IO uint8_t *)&SPI2->DR;
// <20>ṩClock
*(__IO uint8_t *)&SPI2->DR = 0;
while(!(SPI2->SR & SPI_SR_RXNE));
*REG_data = *(__IO uint8_t *)&SPI2->DR;
LIS2DH12_CS_HIGH();
return 1;
}
// <20><>ȡ<EFBFBD>˶<EFBFBD>״̬
void Accelero_ReadStatus(uint8_t int2_pin)
{
// <20><>ǰ<EFBFBD>˶<EFBFBD>״̬
Motion_Status = !int2_pin; // Active low
PRINTF("\r\nHard Motion status = %d\r\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;
}
/**
* @brief EXTI line detection callback.
* @param GPIO_Pin: Specifies the port pin connected to corresponding EXTI line.
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == LL_EXTI_LINE_10)
{
if(Wakeup_Sleeping)
{
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
delay_ms(10);
Vcc_Enable();
delay_ms(40);
Wakeup_Sleeping = 0;
printf("\nWakeup by Accelero ...\n");
}
// <20><>ȡ<EFBFBD>˶<EFBFBD>״̬
Accelero_ReadStatus(LL_GPIO_IsInputPinSet(GPIOD, LL_GPIO_PIN_10));
}
}
// <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()
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
/**SPI2 GPIO Configuration
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/**/
LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_12);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTD, LL_SYSCFG_EXTI_LINE10);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
LL_GPIO_SetPinPull(GPIOD, LL_GPIO_PIN_10, LL_GPIO_PULL_UP);
/**/
LL_GPIO_SetPinMode(GPIOD, LL_GPIO_PIN_10, LL_GPIO_MODE_INPUT);
}
// <20><>ʼ<EFBFBD><CABC>LIS2DH12
void Accelero_Open()
{
LL_SPI_InitTypeDef SPI_InitStruct = {0};
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
/* SPI2 parameter configuration*/
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
SPI_InitStruct.CRCPoly = 7;
LL_SPI_Init(SPI2, &SPI_InitStruct);
LL_SPI_SetStandard(SPI2, LL_SPI_PROTOCOL_MOTOROLA);
LL_SPI_DisableNSSPulseMgt(SPI2);
LL_SPI_SetRxFIFOThreshold(SPI2, LL_SPI_RX_FIFO_TH_QUARTER);
LL_SPI_Enable(SPI2);
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 if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // <20><><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EEB2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
Single_WriteSPI(ACT_THS, 40);
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><C7B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۳<EFBFBD><DBB3><EFBFBD><E6A3AC>ֹ<EFBFBD><D6B9><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
if(!(dcBuff.configDisplay.op_BOX_VER || dcBuff.configDisplay.op_SEND_GPS_DATA))
{
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = DISABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
}
NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(EXTI15_10_IRQn);
}
// <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("\r\nAccelero ID = 0x%02X\r\n", Accelero_ID);
if(Accelero_ID == ACCELERO_ID)
{
Motion_Status = !LL_GPIO_IsInputPinSet(GPIOD, LL_GPIO_PIN_10);
PRINTF("\r\nInit Motion status = %d\r\n", Motion_Status);
}
}