一、硬件电路接口图片
1.ADXL345硬件接口图片使用的是 SPI 端口进行通信,这样读取数据比较快且后续也可以
转化为 IIC 通信接口。
在网上找一些发现 IIC 接口的比较多,所以本人就 DIY 做 SPI 的通信。
2.STM32F103T 系列单片机作为 MCU 资源比较丰富、本人比较熟悉开发速度较快
硬件电路首先是为了实现功能,所以设计比较简单。后续小编想做无线蓝牙的数据传输,所
以硬件上也留了蓝牙串口通信的硬件接口和3.3V 电源管理。
暂且将硬件这样设计,设计为双层 PCB 这样减少了空间。电容、电阻为0805的易焊接。器
件都选为贴片。
二、单片机驱动代码
1.ADXL345的端口配置函数
#define ADXL345_FLAG_TIMEOUT
((uint32_t)0x1000)
#define ADXL345_SPI
#define ADXL345_SPI_CLK
#define ADXL345_SPI_SCK_PIN
#define ADXL345_SPI_SCK_GPIO_PORT
#define ADXL345_SPI_SCK_GPIO_CLK
#define ADXL345_SPI_SCK_SOURCE
#define ADXL345_SPI_SCK_AF
#define ADXL345_SPI_MISO_PIN
#define ADXL345_SPI_MISO_GPIO_PORT
#define ADXL345_SPI_MISO_GPIO_CLK
#define ADXL345_SPI_MISO_SOURCE
#define ADXL345_SPI_MISO_AF
#define ADXL345_SPI_MOSI_PIN
#define ADXL345_SPI_MOSI_GPIO_PORT
#define ADXL345_SPI_MOSI_GPIO_CLK
#define ADXL345_SPI_MOSI_SOURCE
#define ADXL345_SPI_MOSI_AF
SPI1
RCC_APB2Periph_SPI1
GPIO_Pin_5
GPIOA
RCC_APB2Periph_GPIOA
GPIO_PinSource5
GPIO_AF_5
GPIO_Pin_6
GPIOA
RCC_APB2Periph_GPIOA
GPIO_PinSource6
GPIO_AF_5
GPIO_Pin_7
GPIOA
RCC_APB2Periph_GPIOA
GPIO_PinSource7
GPIO_AF_5
#define ADXL345_SPI_CS_PIN
GPIO_Pin_2
#define ADXL345_SPI_CS_GPIO_PORT
#define ADXL345_SPI_CS_GPIO_CLK
GPIOB
RCC_APB2Periph_GPIOB
#define ADXL345_SPI_INT1_PIN
#define ADXL345_SPI_INT1_GPIO_PORT
#define ADXL345_SPI_INT1_GPIO_CLK
#define ADXL345_SPI_INT1_EXTI_LINE
#define ADXL345_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB
#define ADXL345_SPI_INT1_EXTI_PIN_SOURCE EXTI_PinSource0
#define ADXL345_SPI_INT1_EXTI_IRQn
GPIO_Pin_0
GPIOB
RCC_APB2Periph_GPIOB
EXTI_Line0
EXTI0_IRQn
#define ADXL345_SPI_INT2_PIN
#define ADXL345_SPI_INT2_GPIO_PORT
#define ADXL345_SPI_INT2_GPIO_CLK
#define ADXL345_SPI_INT2_EXTI_LINE
#define ADXL345_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB
#define ADXL345_SPI_INT2_EXTI_PIN_SOURCE EXTI_PinSource1
#define ADXL345_SPI_INT2_EXTI_IRQn
GPIO_Pin_1
GPIOB
RCC_APB2Periph_GPIOB
EXTI_Line1
EXTI1_IRQn
#define ADXL345_WHO_AM_I_ADDR
#define ADXL345_CTRL_REG1_ADDR
#define ADXL345_CTRL_REG2_ADDR
#define ADXL345_CTRL_REG3_ADDR
#define ADXL345_CTRL_REG4_ADDR
#define ADXL345_CTRL_REG5_ADDR
#define ADXL345_REFERENCE_REG_ADDR
#define ADXL345_OUT_TEMP_ADDR
#define ADXL345_STATUS_REG_ADDR
#define ADXL345_OUT_X_L_ADDR
#define ADXL345_OUT_X_H_ADDR
#define ADXL345_OUT_Y_L_ADDR
#define ADXL345_OUT_Y_H_ADDR
#define ADXL345_OUT_Z_L_ADDR
#define ADXL345_OUT_Z_H_ADDR
#define ADXL345_FIFO_CTRL_REG_ADDR
#define ADXL345_FIFO_SRC_REG_ADDR
#define ADXL345_INT1_CFG_ADDR
#define ADXL345_INT1_SRC_ADDR
#define ADXL345_INT1_TSH_XH_ADDR
#define ADXL345_INT1_TSH_XL_ADDR
#define ADXL345_INT1_TSH_YH_ADDR
0x0F
0x20
0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2A
0x2B
0x2C
0x2D
0x2E
0x2F
0x30
0x31
0x32
0x33
0x34
#define ADXL345_INT1_TSH_YL_ADDR
#define ADXL345_INT1_TSH_ZH_ADDR
#define ADXL345_INT1_TSH_ZL_ADDR
#define ADXL345_INT1_DURATION_ADDR
0x35
0x36
0x37
0x38
#define I_AM_ADXL345
((uint8_t)0xD4)
#define ADXL345_MODE_POWERDOWN
#define ADXL345_MODE_ACTIVE
((uint8_t)0x00)
((uint8_t)0x08)
#define ADXL345_OUTPUT_DATARATE_1
#define ADXL345_OUTPUT_DATARATE_2
#define ADXL345_OUTPUT_DATARATE_3
#define ADXL345_OUTPUT_DATARATE_4
((uint8_t)0x00)
((uint8_t)0x40)
((uint8_t)0x80)
((uint8_t)0xC0)
#define ADXL345_X_ENABLE
#define ADXL345_Y_ENABLE
#define ADXL345_Z_ENABLE
#define ADXL345_AXES_ENABLE
#define ADXL345_AXES_DISABLE
((uint8_t)0x02)
((uint8_t)0x01)
((uint8_t)0x04)
((uint8_t)0x07)
((uint8_t)0x00)
#define ADXL345_BANDWIDTH_1
#define ADXL345_BANDWIDTH_2
#define ADXL345_BANDWIDTH_3
#define ADXL345_BANDWIDTH_4
((uint8_t)0x00)
((uint8_t)0x10)
((uint8_t)0x20)
((uint8_t)0x30)
#define ADXL345_FULLSCALE_250
#define ADXL345_FULLSCALE_500
#define ADXL345_FULLSCALE_2000
((uint8_t)0x00)
((uint8_t)0x10)
((uint8_t)0x20)
#define ADXL345_BlockDataUpdate_Continous
#define ADXL345_BlockDataUpdate_Single
((uint8_t)0x00)
((uint8_t)0x80)
#define ADXL345_BLE_LSB
#define ADXL345_BLE_MSB
((uint8_t)0x00)
((uint8_t)0x40)
#define ADXL345_HIGHPASSFILTER_DISABLE
#define ADXL345_HIGHPASSFILTER_ENABLE
((uint8_t)0x00)
((uint8_t)0x10)
#define ADXL345_INT1INTERRUPT_DISABLE
#define ADXL345_INT1INTERRUPT_ENABLE
((uint8_t)0x00)
((uint8_t)0x80)
#define ADXL345_INT2INTERRUPT_DISABLE
#define ADXL345_INT2INTERRUPT_ENABLE
((uint8_t)0x00)
((uint8_t)0x08)
#define ADXL345_INT1INTERRUPT_LOW_EDGE
#define ADXL345_INT1INTERRUPT_HIGH_EDGE
((uint8_t)0x20)
((uint8_t)0x00)
#define ADXL345_BOOT_NORMALMODE
#define ADXL345_BOOT_REBOOTMEMORY
((uint8_t)0x00)
((uint8_t)0x80)
#define ADXL345_HPM_NORMAL_MODE_RES
#define ADXL345_HPM_REF_SIGNAL
#define ADXL345_HPM_NORMAL_MODE
#define ADXL345_HPM_AUTORESET_INT
((uint8_t)0x00)
((uint8_t)0x10)
((uint8_t)0x20)
((uint8_t)0x30)
#define ADXL345_HPFCF_0
#define ADXL345_HPFCF_1
#define ADXL345_HPFCF_2
#define ADXL345_HPFCF_3
#define ADXL345_HPFCF_4
#define ADXL345_HPFCF_5
#define ADXL345_HPFCF_6
#define ADXL345_HPFCF_7
#define ADXL345_HPFCF_8
#define ADXL345_HPFCF_9
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
#define
ADXL345_CS_LOW()
GPIO_ResetBits(ADXL345_SPI_CS_GPIO_PORT,
ADXL345_SPI_CS_PIN)
#define
ADXL345_SPI_CS_PIN)
ADXL345_CS_HIGH()
GPIO_SetBits(ADXL345_SPI_CS_GPIO_PORT,
void ADXL345_Init(ADXL345_InitTypeDef *ADXL345_InitStruct);
void ADXL345_RebootCmd(void);
void ADXL345_INT1InterruptCmd(uint8_t InterruptState);
void ADXL345_INT2InterruptCmd(uint8_t InterruptState);
void
*ADXL345_IntConfigStruct);
uint8_t ADXL345_GetDataStatus(void);
ADXL345_INT1InterruptConfig(ADXL345_InterruptConfigTypeDef
void ADXL345_FilterConfig(ADXL345_FilterConfigTypeDef *ADXL345_FilterStruct);
void ADXL345_FilterCmd(uint8_t HighPassFilterState);
void ADXL345_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);
void ADXL345_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);
2.ADXL345的 SPI 配置函数
void SPI_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA |
SPI_InitStructure;
RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(ADXL345_SPI_CLK ,ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =ADXL345_SPI_CS_PIN ;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADXL345_SPI_CS_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(ADXL345_SPI_CS_GPIO_PORT,ADXL345_SPI_CS_PIN);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin
=ADXL345_SPI_SCK_PIN|ADXL345_SPI_MISO_PIN|ADXL345_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADXL345_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(ADXL345_SPI, &SPI_InitStructure);
SPI_Cmd(ADXL345_SPI,ENABLE);
}
3.ADXL345初始化配置函数
void ADXL345_init(void)
{
SPI_init();
//ADXL345¶Ë¿Ú³õʼ»¯ÅäÖÃSPIͨÐÅ
ADXL345_write_byte(0x1E,0x00); //X Æ«ÒÆÁ¿ ¸ù¾Ý²âÊÔ´«¸ÐÆ÷µÄ״̬дÈëpdf29Ò³
0X00 (15.6mg/LSB)
ADXL345_write_byte(0x1F,0x00); //Y Æ«ÒÆÁ¿ ¸ù¾Ý²âÊÔ´«¸ÐÆ÷µÄ״̬дÈëpdf29Ò³
0X00 (15.6mg/LSB)
ADXL345_write_byte(0x20,0x00); //Z Æ«ÒÆÁ¿ ¸ù¾Ý²âÊÔ´«¸ÐÆ÷µÄ״̬дÈëpdf29Ò³
0X00 (15.6mg/LSB)
ADXL345_write_byte(0x21,0x00);
ADXL345_write_byte(0x22,0x00);
(1.25ms/LSB)
//Çû÷ÑÓʱ0:½ûÓÃ; (1.25ms/LSB)
//¼ì²âµÚÒ»´ÎÇû÷ºóµÄÑÓʱ0:½ûÓÃ;
ADXL345_write_byte(0x23,0x00);
//Çû÷´°¿Ú0:½ûÓÃ; (1.25ms/LSB)
ADXL345_write_byte(0x24,0x01);
ADXL345_write_byte(0x25,0x01);
ADXL345_write_byte(0x26,0x2B);
ADXL345_write_byte(0x27,0x00);
//±£´æ¼ì²â»î¶¯·§Öµ; (62.5mg/LSB)
//±£´æ¼ì²â¾²Ö¹·§Öµ; (62.5mg/LSB)
//¼ì²â»î¶¯Ê±¼ä·§Öµ; (1s/LSB)
//
ADXL345_write_byte(0x28,0x09);
ADXL345_write_byte(0x29,0xFF);
//×ÔÓÉÂäÌå¼ì²âÍÆ¼ö·§Öµ; (62.5mg/LSB)
//×ÔÓÉÂäÌå¼ì²âʱ¼ä·§Öµ,ÉèÖÃΪ×î´óʱ¼ä;
(5ms/LSB)
ADXL345_write_byte(0x2A,0x80);
//ADXL345_read_byte(0x2B);
ADXL345_write_byte(0x2C,0x0F); //ËÙÂÊÉ趨Ϊ3200HZ²Î¿¼pdf13Ò³ 0X0A 1OO,0X0E
//Ö»¶Á¼Ä´æÆ÷,״̬¶ÁÈ¡
//
1600HZ
ADXL345_write_byte(0x2D,0x08);
//Ñ¡ÔñµçԴģʽ¹Ø±Õ×Ô¶¯ÐÝÃß,ÐÝÃß,»½Ðѹ¦Äܲο¼pdf24Ò³
ADXL345_write_byte(0x2E,0x80);
ADXL345_write_byte(0x2F,0x00);
//ADXL345_read_byte(0x30);
ADXL345_write_byte(0x31,0X0B);
//ʹÄÜ DATA_READY ÖжÏ
//Ö»¶Á¼Ä´æÆ÷,״̬¶ÁÈ¡
//Êý¾ÝͨПñʽ;ÉèÖÃΪ×Լ칦ÄܽûÓÃ,4ÏßÖÆSPI½Ó¿Ú,µÍµçƽÖжÏÊä³ö,13λȫ·Ö±æÂÊ,
Êä³öÊý¾ÝÓÒ¶ÔÆë,16gÁ¿³Ì
ADXL345_write_byte(0x38,0x00);
//FIFOģʽÉ趨,Streamģʽ£¬´¥·¢Á¬½ÓINT1,31¼¶Ñù±¾»º³å
//Ö»¶Á¼Ä´æÆ÷,״̬¶ÁÈ¡
//ADXL345_read_byte(0x39);
}
4.ADXL345的读写函数
u8 ADXL345_read_byte(u8 add)
GPIO_ResetBits(ADXL345_SPI_CS_GPIO_PORT ,ADXL345_SPI_CS_PIN);
SPI_I2S_SendData(ADXL345_SPI,(add|0x80)<<8|0x00);
while(SPI_I2S_GetFlagStatus(ADXL345_SPI,SPI_I2S_FLAG_TXE)==RESET);
while(SPI_I2S_GetFlagStatus(ADXL345_SPI, SPI_I2S_FLAG_RXNE)==RESET);
GPIO_SetBits(ADXL345_SPI_CS_GPIO_PORT ,ADXL345_SPI_CS_PIN);
return SPI_I2S_ReceiveData(ADXL345_SPI)&0xff;
{
}
void ADXL345_write_byte(u8 add,u8 val)
{
GPIO_ResetBits(ADXL345_SPI_CS_GPIO_PORT ,ADXL345_SPI_CS_PIN);
SPI_I2S_SendData(ADXL345_SPI,add<<8|val);