/* Copyright Statement: * * This software/firmware and related documentation ("AutoChips Software") are * protected under relevant copyright laws. The information contained herein is * confidential and proprietary to AutoChips Inc. and/or its licensors. Without * the prior written permission of AutoChips inc. and/or its licensors, any * reproduction, modification, use or disclosure of AutoChips Software, and * information contained herein, in whole or in part, shall be strictly * prohibited. * * AutoChips Inc. (C) 2022. All rights reserved. * * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE") * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE. */ /****************************************************************************** * @version: V2.0.1 AC7840x Demo ******************************************************************************/ /*! * @file ADXL312.c * * @brief This file contains the user function. * */ /* =========================================== Includes =========================================== */ #include "adxl312.h" #include "spi_hw.h" #include "spi_master_drv.h" #include "spi_slave_drv.h" #include "port_hw.h" #include "gpio_hw.h" #include "gpio.h" #include "debugout_ac7840x.h" #include "osif.h" /* ========================================== Variables =========================================== */ /*! @brief SPI master configure parameter */ spi_master_config_t spiMasteConfig2 = { .bitsPerSec = 100000UL, /*! 设置SPI波特率*/ .whichPcs = SPI_PCS0, /*! 设置SPI片选引脚*/ .pcsPolarity = SPI_ACTIVE_LOW, /*! 设置SPI片选低有效*/ .isPcsContinuous = true, /*! 设置片选连续模式*/ .bitcount = 8UL, /*! SPI 帧长度,支持 4~32 bits*/ .spiSrcClk = 2000000UL, /*! SPI时钟源频率*/ .clkPhase = SPI_CLOCK_PHASE_2ND_EDGE, /*! 设置数据采样相位,第1个边沿采样数据*/ .clkPolarity = SPI_SCK_ACTIVE_LOW, /*! 设置SCK工作时极性,工作时SCK为高*/ .msbFirst = true, /*! 选择从最高位开始收发*/ .transferType = SPI_USING_INTERRUPTS, /*! 选择通信类型为中断方式*/ .rxDMAChannel = 1UL, /*! 设置SPI DMA接收通道,若未使用DMA方式传输,则该配置可忽略*/ .txDMAChannel = 0UL, /*! 设置SPI DMA发送通道,若未使用DMA方式传输,则该配置可忽略*/ .callback = NULL, /*! 注册回调函数 */ .callbackParam = NULL, /*! 回调函数参数 */ }; static spi_state_t s_spiMasterState2; /*! SPI发送和接收数组*/ uint8_t g_adxTxBuff[8] = {1, 2, 3, 4, 5, 6, 7, 8}; uint8_t g_adxRxBuff[8] = {0}; /* ==================================== Functions declaration ===================================== */ void WriteCmd(uint8_t cmd, uint8_t data) { g_adxTxBuff[0] = cmd; g_adxTxBuff[1] = data; SPI_DRV_MasterTransferBlocking(ADXL_SPI_INSTANCE, g_adxTxBuff, g_adxRxBuff, 2, ADXL_SPI_TIMEOUT); } uint8_t ReadCmd(uint8_t cmd) { cmd |=(0x80); g_adxTxBuff[0] = cmd; g_adxTxBuff[1] = 0x00; SPI_DRV_MasterTransferBlocking(ADXL_SPI_INSTANCE, g_adxTxBuff, g_adxRxBuff, 2, ADXL_SPI_TIMEOUT); return g_adxRxBuff[1]; } uint8_t ReadCmd2(uint8_t cmd, uint8_t* data) { g_adxTxBuff[0] = cmd; g_adxTxBuff[1] = 0x00; g_adxTxBuff[2] = 0x00; g_adxTxBuff[3] = 0x00; g_adxTxBuff[4] = 0x00; g_adxTxBuff[5] = 0x00; g_adxTxBuff[6] = 0x00; SPI_DRV_MasterTransferBlocking(ADXL_SPI_INSTANCE, g_adxTxBuff, g_adxRxBuff, 7, ADXL_SPI_TIMEOUT); data[0] = g_adxRxBuff[1]; data[1] = g_adxRxBuff[2]; data[2] = g_adxRxBuff[3]; data[3] = g_adxRxBuff[4]; data[4] = g_adxRxBuff[5]; data[5] = g_adxRxBuff[6]; return 0; } static void SPI_Init_Gpio(void) { GPIO_DRV_SetMuxModeSel(ADXL_SPI_SCK, ADXL_PIN_SCK, PORT_MUX_ALT3); /*! SCK */ GPIO_DRV_SetMuxModeSel(ADXL_SPI_SOUT, ADXL_PIN_SOUT, PORT_MUX_ALT3); /*! SOUT */ GPIO_DRV_SetMuxModeSel(ADXL_SPI_SIN, ADXL_PIN_SIN, PORT_MUX_ALT3); /*! SIN */ GPIO_DRV_SetMuxModeSel(ADXL_SPI_CS, ADXL_PIN_CS, PORT_MUX_ALT3); /*! CS */ //GPIO_DRV_SetPullSel(ADXL_SPI_CS, ADXL_PIN_CS, PORT_INTERNAL_PULL_UP_ENABLED); } void ADXL312_Init(void) { uint8_t tmp_data; SPI_Init_Gpio(); /*! 初始化对应引脚为SPI功能 */ SPI_DRV_MasterInit(ADXL_SPI_INSTANCE, &s_spiMasterState2, &spiMasteConfig2); /*! SPI主机模式初始化 */ NVIC_SetPriority(ADXL_SPI_IRQ, 2); /*! 设置SPI中断优先级 */ //SPI_DRV_MasterSetDelay(ADXL_SPI_INSTANCE, 1U,1U, 1U); tmp_data = ReadCmd(0x00); while(tmp_data!=0xE5) //判断是否器件ID正确 验证SPI通信是否正常 { OSIF_TimeDelay(20); tmp_data = ReadCmd(0x00); } WriteCmd(0x2E, 0x00); WriteCmd(0x31, 0x0B); // 4线SPI 13bit 全分辨率 12g量程 WriteCmd(0x2D, 0x08); //传感器测试模式 WriteCmd(0x2C, 0x0E); //传感器传输数据速率 1600HZ WriteCmd(0x2F, 0x03); WriteCmd(0x38, 0x94); //FIFO 模式 WriteCmd(0x1E, 0x00); WriteCmd(0x1F, 0x00); WriteCmd(0x20, 0x00); //printf(" adxl312 ready 00 \r\n"); } void ADXL312_ReadID(uint8_t* p_id) { uint8_t tmp_data = 0x00; tmp_data = ReadCmd(0x00); *p_id = tmp_data; } uint8_t ADXL312_ReadAcc(int16_t* pAcc_x, int16_t* pAcc_y,int16_t* pAcc_z) { uint8_t tmp[6]; ReadCmd2(0xF2, tmp); *pAcc_x = ((tmp[1]<<8)|tmp[0]); *pAcc_y = ((tmp[3]<<8)|tmp[2]); *pAcc_z = ((tmp[5]<<8)|tmp[4]); return 0; }