查看: 2910|回复: 0

[原创] 【疯狂的四驱车】实验四 8700驱显

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-7-20 18:47:09 | 显示全部楼层 |阅读模式
    本帖最后由 zhjb1 于 2016-7-21 08:18 编辑

    今天有空,昨天看到有人在做板载传感器的作文,于是也来额外实验,与小车可能无关。
    8700传感器有3轴输出,为+-V。此模块的应用在SDK2.0.0中的I2C中的read_accel_value_transfer里面。
    方法与以前的基本一样,也是主要更改:
    board.h中的IO口设置,挡使用TIP、LPTMR 5、UART、ADC后发现以前是用的IO口冲突,为了省事——实际上是为了躲避模块设置的函数不理解,刺猬案例程使用此I/O口有他的道理,所以仅仅更改LCD的口,改到C16,17;B18,19,那么这些模块的I/O口就自己使用了。
    board.h只有以下是自己设的:
    //4Line LCD I/O Define
    #define res  GPIOB
    #define resPin 18U
    #define reg  GPIOB
    #define regPin 19U
    #define clk  GPIOC
    #define clkPin 16U
    #define sda  GPIOC
    #define sdaPin 17U
    其他的只是拷贝过来

    改pin_mux.c
    //Declare and initialise for pull up configuration
    port_pin_config_t pinConfig = {0};
    pinConfig.pullSelect = kPORT_PullUp;
    #if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN
    pinConfig.openDrainEnable = kPORT_OpenDrainEnable;
    #endif //FSL_FEATURE_PORT_HAS_OPEN_DRAIN

    //Initialize UART1 pins below //Ungate the port clock
    CLOCK_EnableClock(kCLOCK_PortB);
    //Affects PORTB_PCR16 PORTB_PCR17 register
    PORT_SetPinMux(PORTB,16U,kPORT_MuxAlt3);
    PORT_SetPinMux(PORTB,17U,kPORT_MuxAlt3);
    //Ungate the port clock
    CLOCK_EnableClock(kCLOCK_PortE);
    //I2C0 pull up resistor setting
    PORT_SetPinConfig(PORTE,24U,&pinConfig);
    PORT_SetPinConfig(PORTE,25U,&pinConfig);
    //I2C0 PIN_MUX Configuration
    PORT_SetPinMux(PORTE,24U,kPORT_MuxAlt5);
    PORT_SetPinMux(PORTE,25U,kPORT_MuxAlt5);
    //Ungate the port clock
    CLOCK_EnableClock(kCLOCK_PortC);
    //I2C1 pull up resistor setting
    PORT_SetPinConfig(PORTC,10U,&pinConfig);
    PORT_SetPinConfig(PORTC,11U,&pinConfig);
    //I2C1 PIN_MUX Configuration
    PORT_SetPinMux(PORTC,10U,kPORT_MuxAlt2);
    PORT_SetPinMux(PORTC,11U,kPORT_MuxAlt2);

    //PTB2, ADC0_SE12 PTB3,ADC0_SE13
    PORT_SetPinMux(PORTB,2U,kPORT_PinDisabledOrAnalog);
    PORT_SetPinMux(PORTB,3U,kPORT_PinDisabledOrAnalog);

    并且将函数void BOARD_I2C_ReleaseBus(void)。拷贝的此文档中
    主函数中添加头文件#include "fsl_i2c.h"
    添加定义变量等:
    //Definitions
    #define ACCEL_I2C_CLK_SRC I2C0_CLK_SRC
    #define I2C_BAUDRATE 100000U
    #define FOXS8700_WHOAMI 0xC7U
    #define MMA8451_WHOAMI 0x1AU
    #define ACCEL_STATUS 0x00U
    #define ACCEL_XYZ_DATA_CFG 0x0EU
    #define ACCEL_CTRL_REG1 0x2AU
    //FOXS8700 and MMA8451 have the same who_am_i register address.
    #define ACCEL_WHOAMI_REG 0x0DU
    #define ACCEL_READ_TIMES 10U


    static bool I2C_ReadAccelWhoAmI(void);
    static bool I2C_WriteAccelReg(I2C_Type *base, uint8_t device_addr, uint8_t reg_addr, uint8_t value);
    static bool I2C_ReadAccelRegs(I2C_Type *base, uint8_t device_addr, uint8_t reg_addr, uint8_t *rxBuff, uint32_t rxSize);

    //Variables  FOXS8700 and MMA8451 device address
    const uint8_t g_accel_address[] = {0x1CU, 0x1DU, 0x1EU, 0x1FU};
    i2c_master_handle_t g_m_handle;
    volatile bool pitIsrFlag = false;


    添加各种变量定义:
    int16_t xx,yy,zz;
    uint8_t g_accel_addr_found = 0x00,status0_value=0;
    volatile bool completionFlag = false;
    volatile bool nakFlag = false;
    bool isThereAccel = false;

    将原来main中的读取I2C——8700 数据的语句移出定义函数:
    //I2C Read Datas onse
    void i2cRead(void){
    if (true == isThereAccel) {
      uint8_t databyte = 0;
      uint8_t write_reg = 0;
      uint8_t readBuff[7];
      //int16_t x, y, z;
      //uint8_t status0_value = 0;
      uint32_t i = 0U;
      /*  please refer to the "example FXOS8700CQ Driver Code" in FXOS8700 datasheet. */
      /*  write 0000 0000 = 0x00 to accelerometer control register 1 */
      /*  standby */
      /*  [7-1] = 0000 000 */
      /*  [0]: active=0 */
      write_reg = ACCEL_CTRL_REG1;
      databyte = 0;
      I2C_WriteAccelReg(BOARD_ACCEL_I2C_BASEADDR, g_accel_addr_found, write_reg, databyte);
      /*  write 0000 0001= 0x01 to XYZ_DATA_CFG register */
      /*  [7]: reserved */
      /*  [6]: reserved */
      /*  [5]: reserved */
      /*  [4]: hpf_out=0 */
      /*  [3]: reserved */
      /*  [2]: reserved */
      /*  [1-0]: fs=01 for accelerometer range of +/-4g range with 0.488mg/LSB */
      /*  databyte = 0x01; */
      write_reg = ACCEL_XYZ_DATA_CFG;
      databyte = 0x01;
      I2C_WriteAccelReg(BOARD_ACCEL_I2C_BASEADDR, g_accel_addr_found, write_reg, databyte);
      /*  write 0000 1101 = 0x0D to accelerometer control register 1 */
      /*  [7-6]: aslp_rate=00 */
      /*  [5-3]: dr=001 for 200Hz data rate (when in hybrid mode) */
      /*  [2]: lnoise=1 for low noise mode */
      /*  [1]: f_read=0 for normal 16 bit reads */
      /*  [0]: active=1 to take the part out of standby and enable sampling */
      /*   databyte = 0x0D; */
      write_reg = ACCEL_CTRL_REG1;
      databyte = 0x0d;
      I2C_WriteAccelReg(BOARD_ACCEL_I2C_BASEADDR, g_accel_addr_found, write_reg, databyte);
      PRINTF("The accel values:\r\n");
      for (i = 0; i < ACCEL_READ_TIMES; i++){//默认读取8次数据,可以按照要求直接将ACCEL_READ_TIMES改成具体id额数值,比如1——读数据次
       status0_value = 0;
       /*  wait for new data are ready. */
       while (status0_value != 0xff){
        I2C_ReadAccelRegs(BOARD_ACCEL_I2C_BASEADDR, g_accel_addr_found, ACCEL_STATUS, &status0_value, 1);
       }
       /*  Multiple-byte Read from STATUS (0x00) register */
       I2C_ReadAccelRegs(BOARD_ACCEL_I2C_BASEADDR, g_accel_addr_found, ACCEL_STATUS, readBuff, 7);
       status0_value = readBuff[0];
       xx = ((int16_t)(((readBuff[1] * 256U) | readBuff[2]))) / 8U;
       yy = ((int16_t)(((readBuff[3] * 256U) | readBuff[4]))) / 8U;
       zz = ((int16_t)(((readBuff[5] * 256U) | readBuff[6]))) / 8U;
       PRINTF("status_reg = 0x%x , x = %5d , y = %5d , z = %5d \r\n", status0_value, xx, yy, zz);
      }
    }
    }

    至此我将tip中断的计数js作为读数据周期,设定为1S1次,结果看照片。为了数据一致性,PC的屏幕与LCD的数据都拍下来,只是清晰度差点。实际数值是除以8,这样最大数值大约为1028左右。
    查看了ftm模块,里面应该有PWM的函数,研究一下应该能解决,就剩下I/O计数得到小车速度的参数了。下周应该有小结果了。

    8700读数驱显

    8700读数驱显
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 18:40 , Processed in 0.079220 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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