找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1571|回复: 1
收起左侧

STC8H单片机通过SPI驱动ADXL345三轴加速度计

[复制链接]
ID:912806 发表于 2022-1-22 16:53 | 显示全部楼层 |阅读模式
使用FwLib_STC8封装库

  1. // Copyright 2021 IOsetting

  2. /***
  3. * Demo: ADXL345
  4. * Board: STC8H8K64U
  5. *                                8H8K64U
  6. * GND       -> GND               G
  7. * VDD(Vcc)  -> VCC               V
  8. * CS        -> GPIO OUT P35      34
  9. * INT1      -> GPIO IN  P36 INT2 35
  10. * INT2      -> GPIO IN  P37 INT3 36
  11. * SDO       -> MISO     P33      30
  12. * SDI/SDA   -> MOSI     P34      31
  13. * SCL       -> SCLK     P32      29
  14. */

  15. #include "fw_hal.h"
  16. #include "adxl345.h"
  17. #include <stdio.h>

  18. volatile uint8_t count_int2 = 0, count_int3 = 0, count_double_tap = 0;
  19. volatile int16_t x, y, z;

  20. void SPI_Init(void)
  21. {
  22.     // ADXL345, SPI CLK max frequency is 5MHz
  23.     SPI_SetClockPrescaler(SPI_ClockPreScaler_16);
  24.     // Clock is high when idle
  25.     SPI_SetClockPolarity(HAL_State_ON);
  26.     // Data transfer is driven by lower SS pin
  27.     SPI_SetClockPhase(SPI_ClockPhase_TrailingEdge);
  28.     // MSB first
  29.     SPI_SetDataOrder(SPI_DataOrder_MSB);
  30.     // Define the output pins
  31.     SPI_SetPort(SPI_AlterPort_P35_P34_P33_P32);
  32.     // Ignore SS pin, use MSTR to swith between master/slave mode
  33.     SPI_IgnoreSlaveSelect(HAL_State_ON);
  34.     // Master mode
  35.     SPI_SetMasterMode(HAL_State_ON);
  36.     // Start SPI
  37.     SPI_SetEnabled(HAL_State_ON);
  38. }

  39. void GPIO_Init(void)
  40. {
  41.     // Configure GPIO pins before SPI and device
  42.     // MISO(P33), MOSI(P34)
  43.     GPIO_P3_SetMode(GPIO_Pin_3|GPIO_Pin_4, GPIO_Mode_InOut_QBD);
  44.     // SCLK(P32), CS(P35),
  45.     GPIO_P3_SetMode(GPIO_Pin_2|GPIO_Pin_5, GPIO_Mode_Output_PP);
  46.     // INT2(P36), INT3(P37)
  47.     GPIO_P3_SetMode(GPIO_Pin_6|GPIO_Pin_7, GPIO_Mode_Input_HIP);
  48. }

  49. void INT_Init()
  50. {
  51.     EXTI_Int2_SetIntState(HAL_State_ON);
  52.     EXTI_Int3_SetIntState(HAL_State_ON);
  53.     EXTI_Global_SetIntState(HAL_State_ON);
  54. }

  55. INTERRUPT(Int2_Routine, EXTI_VectInt2)
  56. {
  57.     count_int2++;
  58.     if (ADXL345_IsInterrupt(ADXL345_INT_DOUBLE_TAP) > 0)
  59.     {
  60.         count_double_tap++;
  61.     }
  62.    
  63. }

  64. INTERRUPT(Int3_Routine, EXTI_VectInt3)
  65. {
  66.     count_int3++;
  67.     x = ADXL345_ReadInt(ADXL345_REG_DATAX0);
  68.     y = ADXL345_ReadInt(ADXL345_REG_DATAY0);
  69.     z = ADXL345_ReadInt(ADXL345_REG_DATAZ0);
  70. }

  71. int main(void)
  72. {
  73.     SYS_SetClock();
  74.     GPIO_Init();
  75.     UART1_Config8bitUart(UART1_BaudSource_Timer1, HAL_State_ON, 115200);
  76.     SPI_Init();
  77.     INT_Init();
  78.     ADXL345_Init(
  79.         ADXL345_DATARATE_100_HZ,
  80.         ADXL345_SPI_WIRE_4,
  81.         ADXL345_INT_ACTIVE_LOW,
  82.         ADXL345_DATA_RESOLVE_FULL,
  83.         ADXL345_DATA_ALIGNMENT_RIGHT,
  84.         ADXL345_G_RANGE_8G
  85.     );
  86.     // Tap threshold: 62.5mg / LSB, value = 2.5g / 0.0625g = 0x28
  87.     ADXL345_WriteByte(ADXL345_REG_THRESH_TAP, 0x28);
  88.     // Tap duration: 625us / LSB, value = 0.02s / 0.000625s = 0x20
  89.     ADXL345_WriteByte(ADXL345_REG_DUR, 0x20);
  90.     // Tap latency: 1.25ms / LSB, value = 0.1s / 0.00125s = 0x50
  91.     ADXL345_WriteByte(ADXL345_REG_LATENT, 0x50);
  92.     // Tap window: 1.25ms / LSB, value = 0.3s / 0.00125s = 0xF0
  93.     ADXL345_WriteByte(ADXL345_REG_WINDOW, 0xF0);
  94.     ADXL345_EnableTapDetectOnAxes(
  95.         ADXL345_TAP_DETECT_AXIS_X|ADXL345_TAP_DETECT_AXIS_Y|ADXL345_TAP_DETECT_AXIS_Z);
  96.     ADXL345_SetInterrupts(
  97.         ADXL345_INT_DATA_READY|ADXL345_INT_SINGLE_TAP|ADXL345_INT_DOUBLE_TAP);
  98.     ADXL345_RemapInterrupts(ADXL345_INT_DATA_READY);

  99.     // read to clear interrupts, or the counter will never receive interrupts
  100.     x = ADXL345_ReadInt(ADXL345_REG_DATAX0);
  101.     y = ADXL345_ReadInt(ADXL345_REG_DATAY0);
  102.     z = ADXL345_ReadInt(ADXL345_REG_DATAZ0);
  103.     x = ADXL345_ReadByte(ADXL345_REG_INT_SOURCE);

  104.     while(1)
  105.     {
  106.         printf("X:%6d, Y:%6d, Z:%6d, DAT:%3d, TAP:%3d, 2-TAP:%3d\r\n",
  107.             x, y, z, count_int3, count_int2, count_double_tap);
  108.         SYS_Delay(50);
  109.     }
  110. }
复制代码

关于代码的说明
https://www.cnblogs.com/milton/p/15821704.html

完整代码查看
Github: https://github.com/IOsetting/FwLib_STC8/tree/master/demo/spi/adxl345
Gitee:
https://gitee.com/iosetting/fw-lib_-stc8/tree/master/demo/spi/adxl345

回复

使用道具 举报

ID:704640 发表于 2022-7-9 16:29 | 显示全部楼层
老师好,请教一下,void GPIO_Init(void) {     // Configure GPIO pins before SPI and device     // MISO(P33), MOSI(P34)     GPIO_P3_SetMode(GPIO_Pin_3|GPIO_Pin_4, GPIO_Mode_InOut_QBD);     // SCLK(P32), CS(P35),     GPIO_P3_SetMode(GPIO_Pin_2|GPIO_Pin_5, GPIO_Mode_Output_PP);     // INT2(P36), INT3(P37)     GPIO_P3_SetMode(GPIO_Pin_6|GPIO_Pin_7, GPIO_Mode_Input_HIP); },,,,,,再加上上面的FW_hal库,这个好像是STM32HAL的代码吧?为什么在这里能上STC8,不明白
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表