在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 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读数驱显
|