This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2541,使用I2C从三轴加速度传感器读取数据

Other Parts Discussed in Thread: CC2541

想用CC2541从三轴加速度传感器MMA8451读取三轴加速度传感器,不知到TI官方有没有这样的demo,keyfob上使用的三轴加速度传感器是什么,有没有现成的利用CC2541从三轴加速度传感器读取加速度的demo。

  • 有例称,可能不是MMA8451,不过可以去参考!

  • 可以给个链接吗,谢谢了

  • 是怎么样的例程,给个链接给我,先谢谢了

  • keyfob上用的是博世的BMA250,sensortag上用的是KXTJ9-1007。个人建议你用sensortag上的例程做修改,使用IIC通讯,而且传感器你也可以使用一样的型号,因为这个系列的传感器功耗很小,相同ODR下的功耗不到8451的一半。另外飞思卡尔也出新的低功耗的ACC了,你可以选个别的型号

  • 例程的话,你可以去官网下载1.4的协议栈,安装上之后就有了。里边有很多例程 血压计的、sensortag的、simpleperipheral工程(keyfob)

  • /**************************************************************************//**

        @file       bma250.c

        @brief      Functions for accessing accelerometer BMA250 on CC2541 keyfob.

    ******************************************************************************/


    /******************************************************************************
     * INCLUDES
     */
    #include <ioCC2541.h>
    #include "bma250.h"


    /******************************************************************************
     * DEFINES
     */
    // Accelerometer connected at (names in brackets are BMA250 names)
    // P2_0 = VDD (VDD/VDDIO)
    // P1_2 = CS_N (CSB)
    // P1_3 = SCK (SCx)
    // P1_4 = MISO (SDO)
    // P1_5 = MOSI (SDx)
    // P1_7 = (INT1)

    #define CS              P1_2
    #define SCK             P1_3
    #define MISO            P1_4
    #define MOSI            P1_5

    #define CS_DISABLED     1
    #define CS_ENABLED      0

    // OR bitmask into reg (read, modify, write)
    #define ACC_INT_ENABLE(reg, bm)     { uint8 val; accReadReg((reg),&val); \
                                          val |= (bm); accWriteReg((reg),val); }
    // AND inverted bitmask into reg (read, modify write)
    #define ACC_INT_DISABLE(reg, bm)    { uint8 val; accReadReg((reg),&val); \
                                          val &= ~(bm); accWriteReg((reg),val); }


    /******************************************************************************
     * FUNCTION PROTOTYPES
     */
    void spiWriteByte(uint8 write);
    void spiReadByte(uint8 *read, uint8 write);

    /******************************************************************************
     * LOCAL VARIABLES
     */
    static uint8 acc_initialized = FALSE;


    /******************************************************************************
     * FUNCTIONS
     */

    /**************************************************************************//**
    * @fn       accInit(void)
    *
    * @brief    Initialize SPI interface and BMA250 accelerometer.
    *
    * @return   void
    ******************************************************************************/
    void accInit(void)
    {
        //*** Enable Accelerometer power ***
        P2DIR |=  0x01;     // Set P2_0 as output high
        P2SEL &= ~0x01;
        P2    |=  0x01;

        //*** Setup USART 0 SPI at alternate location 2 ***
        // USART 0 at alternate location 2
        PERCFG |= 0x01;
        // Peripheral function on SCK, MISO and MOSI (P1_3-5)
        P1SEL |= 0x38;
        // Configure CS (P1_2) as output
        P1DIR |= 0x04;
        CS = CS_DISABLED;

        //*** Setup the SPI interface ***
        // SPI master mode
        U0CSR = 0x00;
        // Negative clock polarity, Phase: data out on CPOL -> CPOL-inv
        //                                 data in on CPOL-inv -> CPOL
        // MSB first
        U0GCR = 0x20;
        // SCK frequency = 3MHz (MBA250 max=10MHz, CC254x max = 4MHz)
        U0GCR |= 0x10;
        U0BAUD = 0x80;

        // *** Configure accelerometer ***
        // Wait 2ms for accelerometer to power up and settle
        WAIT_MS(2);

        // Disable all interrupts
        ACC_INT_DISABLE(ACC_INT_ENABLE0, 0xFF);
        ACC_INT_DISABLE(ACC_INT_ENABLE1, 0xFF);

        // Set 2G range
        accWriteReg(ACC_RANGE, ACC_RANGE_2G);

        // Filter detection bandwidth (Time between samples = 1/(2*filter_bw))
        accWriteReg(ACC_BW, ACC_BW_250HZ);


    #ifdef ENABLE_BMA250_INTERRUPT
        // *** New data interrupt on INT1, active high ***
        // INT1 as push-pull, active high
        accWriteReg(ACC_INT_PIN_BEHAVIOR, ACC_INT1_LVL);

        // Map New data interrupt to INT1
        accWriteReg(ACC_INT_MAPPING1, ACC_INT1_MAP_DATA);

        // Enable new data interrupts
        ACC_INT_ENABLE(ACC_INT_ENABLE1, ACC_INT_DATA_EN);
    #endif

        acc_initialized = TRUE;
    } // accInit


    /**************************************************************************//**
    * @fn       accStop(void)
    *
    * @brief    Sets the BMA250 accelerometer in low-power mode.
    *
    * @return   void
    ******************************************************************************/
    void accStop(void)
    {
      if (acc_initialized) {
        // We cheat and simply turn off power to the accelerometer
        P2_0  =  0x00;  // If init has been run this pin is already output.
        acc_initialized = FALSE;
      }
    }

    /**************************************************************************//**
    * @fn       accWriteReg(uint8 reg, uint8 val)
    *
    * @brief    Write one byte to a sensor register
    *
    * @param    reg     Register address
    * @param    val     Value to write
    *
    * @return   void
    ******************************************************************************/
    void accWriteReg(uint8 reg, uint8 val)
    {
        CS = CS_ENABLED;
        spiWriteByte(reg);      // Write address
        spiWriteByte(val);      // Write value
        CS = CS_DISABLED;
    }


    /**************************************************************************//**
    * @fn       accReadReg(uint8 reg, uint8 *pVal)
    *
    * @brief    Read one byte from a sensor register
    *
    * @param    reg     Register address
    * @param    val     Pointer to destination of read value
    *
    * @return   void
    ******************************************************************************/
    void accReadReg(uint8 reg, uint8 *pVal)
    {
        CS = CS_ENABLED;
        spiWriteByte(0x80|reg);     // Write address
        spiReadByte(pVal, 0xFF);    // Write dummy data and read returned value
        CS = CS_DISABLED;
    }


    /**************************************************************************//**
    * @fn       accReadAcc(int16 *pXVal, int16 *pYVal, int16 *pZVal)
    *
    * @brief    Read x, y and z acceleration data in one operation.
    *
    * @param    pXVal   Pointer to destination of read out X acceleration
    * @param    pYVal   Pointer to destination of read out Y acceleration
    * @param    pZVal   Pointer to destination of read out Z acceleration
    *
    * @return   void
    ******************************************************************************/
    void accReadAcc(int8 *pXVal, int8 *pYVal, int8 *pZVal)
    {
        int8 readout[6] = {0,0,0,0,0,0};

        // Read all data from accelerometer
        CS = CS_ENABLED;
        spiWriteByte(0x80|ACC_X_LSB);     // Write start address
        for(uint8 i = 0; i<6; i++)
        {
            spiReadByte((uint8 *)&readout[i], 0xFF); // Read byte
        }
        CS = CS_DISABLED;

        // Use only most significant byte of each channel.
        *pXVal = readout[1];
        *pYVal = readout[3];
        *pZVal = readout[5];

    } // accReadAcc


    /**************************************************************************//**
    * @fn       accReadAcc(int16 *pXVal, int16 *pYVal, int16 *pZVal)
    *
    * @brief    Read x, y and z acceleration data in one operation.
    *
    * @param    pXVal   Pointer to destination of read out X acceleration
    * @param    pYVal   Pointer to destination of read out Y acceleration
    * @param    pZVal   Pointer to destination of read out Z acceleration
    *
    * @return   void
    ******************************************************************************/
    void accReadAcc16(int16 *pXVal, int16 *pYVal, int16 *pZVal)
    {
        int8 readout[6] = {0,0,0,0,0,0};

        // Read all data from accelerometer
        CS = CS_ENABLED;
        spiWriteByte(0x80|ACC_X_LSB);     // Write start address
        for(uint8 i = 0; i<6; i++)
        {
            spiReadByte((uint8 *)&readout[i], 0xFF); // Read byte
        }
        CS = CS_DISABLED;

        // Merge high byte (8b) and low bits (2b) into 16b signed destination
        *pXVal = ( (((uint8)readout[0]) >> 6) | ((int16)(readout[1]) << 2) );
        *pYVal = ( (((uint8)readout[2]) >> 6) | ((int16)(readout[3]) << 2) );
        *pZVal = ( (((uint8)readout[4]) >> 6) | ((int16)(readout[5]) << 2) );

    } // accReadAcc16


    /**************************************************************************//**
    * @fn       spiWriteByte(uint8 write)
    *
    * @brief    Write one byte to SPI interface
    *
    * @param    write   Value to write
    ******************************************************************************/
    void spiWriteByte(uint8 write)
    {
            U0CSR &= ~0x02;                 // Clear TX_BYTE
            U0DBUF = write;
            while (!(U0CSR & 0x02));        // Wait for TX_BYTE to be set
    }


    /**************************************************************************//**
    * @fn       spiReadByte(uint8 *read, uint8 write)
    *
    * @brief    Read one byte from SPI interface
    *
    * @param    read    Read out value
    * @param    write   Value to write
    ******************************************************************************/
    void spiReadByte(uint8 *read, uint8 write)
    {
            U0CSR &= ~0x02;                 // Clear TX_BYTE
            U0DBUF = write;                 // Write address to accelerometer
            while (!(U0CSR & 0x02));        // Wait for TX_BYTE to be set
            *read = U0DBUF;                 // Save returned value
    }


    /******************************************************************************
      Copyright 2011 Texas Instruments Incorporated. All rights reserved.

      IMPORTANT: Your use of this Software is limited to those specific rights
      granted under the terms of a software license agreement between the user
      who downloaded the software, his/her employer (which must be your employer)
      and Texas Instruments Incorporated (the "License").  You may not use this
      Software unless you agree to abide by the terms of the License. The License
      limits your use, and you acknowledge, that the Software may not be modified,
      copied or distributed unless embedded on a Texas Instruments microcontroller
      or used solely and exclusively in conjunction with a Texas Instruments radio
      frequency transceiver, which is integrated into your product.  Other than for
      the foregoing purpose, you may not use, reproduce, copy, prepare derivative
      works of, modify, distribute, perform, display or sell this Software and/or
      its documentation for any purpose.

      YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
      PROVIDED ?AS IS? WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
      INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
      NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
      TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
      NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
      LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
      INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
      OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
      OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
      (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.

      Should you have any questions regarding your right to use this Software,
      contact Texas Instruments Incorporated at www.TI.com.
    ******************************************************************************/

  • 这个是spi工作模式的!