logo资料库

adxl345的STM32驱动程序和硬件设计.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
一、硬件电路接口图片 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);
分享到:
收藏