PSoC 4XX7_BLE 有两个 SCB,每一个 SCB 都可以实现 I2C、 UART 或 SPI 接口。 I2C 模式:硬件 I2C 模块实现了一个完整的多主设备和从设备接 口(它具有多主设备仲裁功能)。该模块的工作速度可达 1 Mbps (增强型快速模块),另外它还提供各种灵活的缓冲选项,以降低 CPU 的中断开销和延迟。该模块还具有一个 EzI2C,通过它可以 在 PSoC 4XX7_BLE 存储器中创建缓冲存储器的地址范围,并且 对存储器中的阵列进行读写操作时可以大量降低I2C通信。此外,该模块提供一个深度为 8 字节的 FIFO,用于数据的接收和传送。 该模块延长了 CPU 读取数据的时间,从而减少了时钟延展的发生(由于 CPU 没有及时读取数据,因此才导致时钟延展)。FIFO 可用在所有通道,在没有 DMA 的情况下非常有用。 相关引脚在以下
与MPU6050 连接
相关代码
- #include
- static uint32 MPU_CommPrepare(void)
- {
- uint32 status;
- I2CM_Start();
- status=I2CM_I2CMasterClearStatus();
- return status;
- }
- static uint32 MPU_CommEnd(void)
- {
- I2CM_Stop();
- return 1;
- }
- static uint32 MPU_Write_Byte(uint8 tDeviceAddr,uint8 tREG_Address, uint8 tREG_Data)
- {
- uint32 status;
- status=I2CM_I2CMasterSendStart(tDeviceAddr,I2CM_I2C_WRITE_XFER_MODE); //校验地址+写入模式
- while(status!=I2CM_I2C_MSTR_NO_ERROR);
- status=I2CM_I2CMasterWriteByte(tREG_Address);
- status=I2CM_I2CMasterWriteByte(tREG_Data);
- status=I2CM_I2CMasterSendStop();
- return status;
- }
- static uint8 MPU_Read_Byte(uint8 tDeviceAddr,uint8 tREG_Address)
- {
- uint32 status;
- uint8 result=0;
- I2CM_Start();
- status=I2CM_I2CMasterSendStart(tDeviceAddr,I2CM_I2C_WRITE_XFER_MODE); //校验地址+写入模式
- while(status!=I2CM_I2C_MSTR_NO_ERROR);
- status=I2CM_I2CMasterWriteByte(tREG_Address);
- I2CM_Start();
- status=I2CM_I2CMasterSendRestart(tDeviceAddr,I2CM_I2C_READ_XFER_MODE);
- result=I2CM_I2CMasterReadByte(I2CM_I2C_ACK_DATA);
- I2CM_Stop();
- return result;
-
- }
- /* ------------------------ Typedef 定义类型 -------------------------------- */
- /* ------------------------ Macro Define 宏定义 ----------------------------- */
- //****************************************
- // 定义MPU6050内部地址
- //****************************************
- #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
- #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
- #define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
- #define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
- #define ACCEL_XOUT_H 0x3B
- #define ACCEL_XOUT_L 0x3C
- #define ACCEL_YOUT_H 0x3D
- #define ACCEL_YOUT_L 0x3E
- #define ACCEL_ZOUT_H 0x3F
- #define ACCEL_ZOUT_L 0x40
- #define TEMP_OUT_H 0x41
- #define TEMP_OUT_L 0x42
- #define GYRO_XOUT_H 0x43
- #define GYRO_XOUT_L 0x44
- #define GYRO_YOUT_H 0x45
- #define GYRO_YOUT_L 0x46
- #define GYRO_ZOUT_H 0x47
- #define GYRO_ZOUT_L 0x48
- #define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
- #define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)
- #define MPUAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
- #define MPU6050_ADDRESS_AD0_LOW 0x68 //b1101000 address pin low (GND), default for InvenSense evaluation board
- #define MPU6050_ADDRESS_AD0_HIGH 0x69 //b1101001 address pin high (VCC)
- #define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_LOW
- /*寄存器*/
- #define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
- #define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
- #define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
- #define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN
- #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN
- #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN
- #define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
- #define MPU6050_RA_XA_OFFS_L_TC 0x07
- #define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
- #define MPU6050_RA_YA_OFFS_L_TC 0x09
- #define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
- #define MPU6050_RA_ZA_OFFS_L_TC 0x0B
- #define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR
- #define MPU6050_RA_XG_OFFS_USRL 0x14
- #define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR
- #define MPU6050_RA_YG_OFFS_USRL 0x16
- #define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR
- #define MPU6050_RA_ZG_OFFS_USRL 0x18
- /*以上寄存器在DATASHEEL查不到*/
- #define MPU6050_RA_SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
- #define MPU6050_RA_CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
- #define MPU6050_RA_GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
- #define MPU6050_RA_ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
- #define MPU6050_RA_FF_THR 0x1D
- #define MPU6050_RA_FF_DUR 0x1E
- #define MPU6050_RA_MOT_THR 0x1F
- #define MPU6050_RA_MOT_DUR 0x20
- #define MPU6050_RA_ZRMOT_THR 0x21
- #define MPU6050_RA_ZRMOT_DUR 0x22
- #define MPU6050_RA_FIFO_EN 0x23
- #define MPU6050_RA_I2C_MST_CTRL 0x24
- #define MPU6050_RA_I2C_SLV0_ADDR 0x25
- #define MPU6050_RA_I2C_SLV0_REG 0x26
- #define MPU6050_RA_I2C_SLV0_CTRL 0x27
- #define MPU6050_RA_I2C_SLV1_ADDR 0x28
- #define MPU6050_RA_I2C_SLV1_REG 0x29
- #define MPU6050_RA_I2C_SLV1_CTRL 0x2A
- #define MPU6050_RA_I2C_SLV2_ADDR 0x2B
- #define MPU6050_RA_I2C_SLV2_REG 0x2C
- #define MPU6050_RA_I2C_SLV2_CTRL 0x2D
- #define MPU6050_RA_I2C_SLV3_ADDR 0x2E
- #define MPU6050_RA_I2C_SLV3_REG 0x2F
- #define MPU6050_RA_I2C_SLV3_CTRL 0x30
- #define MPU6050_RA_I2C_SLV4_ADDR 0x31
- #define MPU6050_RA_I2C_SLV4_REG 0x32
- #define MPU6050_RA_I2C_SLV4_DO 0x33
- #define MPU6050_RA_I2C_SLV4_CTRL 0x34
- #define MPU6050_RA_I2C_SLV4_DI 0x35
- #define MPU6050_RA_I2C_MST_STATUS 0x36
- #define MPU6050_RA_INT_PIN_CFG 0x37
- #define MPU6050_RA_INT_ENABLE 0x38
- #define MPU6050_RA_DMP_INT_STATUS 0x39
- #define MPU6050_RA_INT_STATUS 0x3A
- #define MPU6050_RA_ACCEL_XOUT_H 0x3B
- #define MPU6050_RA_ACCEL_XOUT_L 0x3C
- #define MPU6050_RA_ACCEL_YOUT_H 0x3D
- #define MPU6050_RA_ACCEL_YOUT_L 0x3E
- #define MPU6050_RA_ACCEL_ZOUT_H 0x3F
- #define MPU6050_RA_ACCEL_ZOUT_L 0x40
- #define MPU6050_RA_TEMP_OUT_H 0x41
- #define MPU6050_RA_TEMP_OUT_L 0x42
- #define MPU6050_RA_GYRO_XOUT_H 0x43
- #define MPU6050_RA_GYRO_XOUT_L 0x44
- #define MPU6050_RA_GYRO_YOUT_H 0x45
- #define MPU6050_RA_GYRO_YOUT_L 0x46
- #define MPU6050_RA_GYRO_ZOUT_H 0x47
- #define MPU6050_RA_GYRO_ZOUT_L 0x48
- #define MPU6050_RA_EXT_SENS_DATA_00 0x49
- #define MPU6050_RA_EXT_SENS_DATA_01 0x4A
- #define MPU6050_RA_EXT_SENS_DATA_02 0x4B
- #define MPU6050_RA_EXT_SENS_DATA_03 0x4C
- #define MPU6050_RA_EXT_SENS_DATA_04 0x4D
- #define MPU6050_RA_EXT_SENS_DATA_05 0x4E
- #define MPU6050_RA_EXT_SENS_DATA_06 0x4F
- #define MPU6050_RA_EXT_SENS_DATA_07 0x50
- #define MPU6050_RA_EXT_SENS_DATA_08 0x51
- #define MPU6050_RA_EXT_SENS_DATA_09 0x52
- #define MPU6050_RA_EXT_SENS_DATA_10 0x53
- #define MPU6050_RA_EXT_SENS_DATA_11 0x54
- #define MPU6050_RA_EXT_SENS_DATA_12 0x55
- #define MPU6050_RA_EXT_SENS_DATA_13 0x56
- #define MPU6050_RA_EXT_SENS_DATA_14 0x57
- #define MPU6050_RA_EXT_SENS_DATA_15 0x58
- #define MPU6050_RA_EXT_SENS_DATA_16 0x59
- #define MPU6050_RA_EXT_SENS_DATA_17 0x5A
- #define MPU6050_RA_EXT_SENS_DATA_18 0x5B
- #define MPU6050_RA_EXT_SENS_DATA_19 0x5C
- #define MPU6050_RA_EXT_SENS_DATA_20 0x5D
- #define MPU6050_RA_EXT_SENS_DATA_21 0x5E
- #define MPU6050_RA_EXT_SENS_DATA_22 0x5F
- #define MPU6050_RA_EXT_SENS_DATA_23 0x60
- #define MPU6050_RA_MOT_DETECT_STATUS 0x61
- #define MPU6050_RA_I2C_SLV0_DO 0x63
- #define MPU6050_RA_I2C_SLV1_DO 0x64
- #define MPU6050_RA_I2C_SLV2_DO 0x65
- #define MPU6050_RA_I2C_SLV3_DO 0x66
- #define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67
- #define MPU6050_RA_SIGNAL_PATH_RESET 0x68
- #define MPU6050_RA_MOT_DETECT_CTRL 0x69
- #define MPU6050_RA_USER_CTRL 0x6A
- #define MPU6050_RA_PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
- #define MPU6050_RA_PWR_MGMT_2 0x6C
- #define MPU6050_RA_BANK_SEL 0x6D
- #define MPU6050_RA_MEM_START_ADDR 0x6E
- #define MPU6050_RA_MEM_R_W 0x6F
- #define MPU6050_RA_DMP_CFG_1 0x70
- #define MPU6050_RA_DMP_CFG_2 0x71
- #define MPU6050_RA_FIFO_COUNTH 0x72
- #define MPU6050_RA_FIFO_COUNTL 0x73
- #define MPU6050_RA_FIFO_R_W 0x74
- #define MPU6050_RA_WHO_AM_I 0x75
- /* ------------------------ Variables 变量 ---------------------------------- */
- /* ------------------------ Functions 函数声明 ------------------------------ */
- /********************************************************************************
- 内部私有函数
- *********************************************************************************/
- /********************************************************************************
- 外部公用函数
- *********************************************************************************/
- /* *****************************************************************************
- * 函数名:MPU6050_Init
- * 描述 :MPU6050I/O配置 及其初始化
- * 输入 :无
- * 输出 :无
- * 调用 :外部调用
- * 注意 :
- ******************************************************************************/
- void MPU6050_Init(void)
- {
- MPU_CommPrepare();
- /*********************************************/
- /*1、解除休眠状态*/
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_PWR_MGMT_1,0x00);//电源管理,典型值:0x00(正常启用) internal 8MHz oscillator
-
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_SMPLRT_DIV,0x01);//陀螺仪采样率,典型值:0x07(125Hz) 输出频率1KHZ
-
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_CONFIG, 0x06);//低通滤波频率,典型值:0x06(5Hz)
-
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_GYRO_CONFIG, 0x08);//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_ACCEL_CONFIG, 0x01);//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
-
- /*****************************************/
- /* 设置中断方式 */
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_INT_PIN_CFG,0x80);//中断生产 上升沿,INT推挽输出,高电平至中断状态被读取0x80
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_INT_ENABLE,0x01);//使能中断,Data Ready interrupt 0x01
- /*****************************************/
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_FF_THR, 0x00);//Freefall threshold of |0mg|
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_FF_DUR, 0x00);//Freefall duration limit of 0
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_MOT_THR, 0x00);//Motion threshold of 0mg
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_MOT_DUR, 0x00);//Motion duration of 0s
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_ZRMOT_THR, 0x00);//Zero motion threshold
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_ZRMOT_DUR, 0x00); //Zero motion duration threshold
- MPU_Write_Byte(MPU6050_DEFAULT_ADDRESS,MPU6050_RA_FIFO_EN, 0x00);//Disable sensor output to FIFO buffer
-
- /*********************************************/
- MPU_CommEnd();
- }
-
- /* *****************************************************************************
- * 函数名:MPU6050_Destory
- * 描述 :MPU6050释放资源
- * 输入 :无
- * 输出 :无
- * 调用 :外部调用
- * 注意 :
- ******************************************************************************/
- void MPU6050_Destory(void)
- {
-
- }
- void MPU6050_GetRes(float acce[3],float gyro[3],int16_t res[6])
- {
- //#define MPU6050_GYRO_FS_SENSITIVITY 65.5 //+/- 500 degrees/sec 65.5LSB/deg/s
- #define MPU6050_GYRO_FS_SENSITIVITY ((float)16.4) //+/- 2000 degrees/sec 16.4LSB/deg/s
- #define MPU6050_ACCE_FS_SENSITIVITY ((float)16384.0) //+/- 2g 16384LSB/mg
- uint8_t ucData[12];
-
- ucData[0] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_XOUT_H);
- ucData[1] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_XOUT_L);
- ucData[2] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_YOUT_H);
- ucData[3] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_YOUT_L);
- ucData[4] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_ZOUT_H);
- ucData[5] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,ACCEL_ZOUT_L);
-
- ucData[6] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_XOUT_H);
- ucData[7] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_XOUT_L);
- ucData[8] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_YOUT_H);
- ucData[9] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_YOUT_L);
- ucData[10] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_ZOUT_H);
- ucData[11] = MPU_Read_Byte(MPU6050_DEFAULT_ADDRESS,GYRO_ZOUT_L);
-
- if(acce!= (float*)0)
- {
- acce[0] = (float)((int16_t)((ucData[0]<<8)|(ucData[1])))/MPU6050_ACCE_FS_SENSITIVITY;
- acce[1] = (float)((int16_t)((ucData[2]<<8)|(ucData[3])))/MPU6050_ACCE_FS_SENSITIVITY;
- acce[2] = (float)((int16_t)((ucData[4]<<8)|(ucData[5])))/MPU6050_ACCE_FS_SENSITIVITY;
- }
- if(gyro!= (float*)0)
- {
- gyro[0] = (float)((int16_t)((ucData[6]<<8)|(ucData[7])))/MPU6050_GYRO_FS_SENSITIVITY;
- gyro[1] = (float)((int16_t)((ucData[8]<<8)|(ucData[9])))/MPU6050_GYRO_FS_SENSITIVITY;
- gyro[2] = (float)((int16_t)((ucData[10]<<8)|(ucData[11])))/MPU6050_GYRO_FS_SENSITIVITY;
- }
- if(res!= (int16_t*)0)
- {
- res[0]= ((int16_t)((ucData[0]<<8)|(ucData[1])));
- res[1]= ((int16_t)((ucData[2]<<8)|(ucData[3])));
- res[2]= ((int16_t)((ucData[4]<<8)|(ucData[5])));
- res[3]= ((int16_t)((ucData[6]<<8)|(ucData[7])));
- res[4]= ((int16_t)((ucData[8]<<8)|(ucData[9])));
- res[5]= ((int16_t)((ucData[10]<<8)|(ucData[10])));
- }
-
- }
复制代码
- #include
- #include "MPU6050.h"
- #define LED_ON (0u)
- #define LED_OFF (1u)
- #include
- #include
- void uart_printf_block (char const *format, ...)
- {
- uint8_t buf_str[256u];
- va_list v_args;
- va_start(v_args, format);
- (void)vsnprintf((char *)&buf_str[0],
- (size_t ) sizeof(buf_str),
- (char const *) format,
- v_args);
- va_end(v_args);
-
- UART_UartPutString((const char8 *)&buf_str[0]);
- return ;
- }
- void main()
- {
- //uint32 ch;
- float fAcce[3]={0};
- float fGryo[3]={0};
- char buf_str[256u];
-
-
- /* Start SCB (UART mode) operation */
- UART_Start();
-
- /* Init the Mpu6050*/
- MPU6050_Init();
- UART_UartPutString("rn***********************************************************************************rn");
- UART_UartPutString("This is MPU6050 example projectrn");
- UART_UartPutString("rn");
-
-
- for(;;)
- {
- CyDelay(200);
- MPU6050_GetRes(fAcce,fGryo,0);
- uart_printf_block("%f,%f,%f,%f,%f,%fn",fAcce[0],fAcce[1],fAcce[2],fGryo[0],fGryo[1],fGryo[2]);
-
- //sprintf(buf_str,"%.2f,%.2f,%.2f,%.2f,%.2f,%.2fn",13.4,fAcce[1],fAcce[2],fGryo[0],fGryo[1],fGryo[2]);
- //UART_UartPutString((const char8 *)&buf_str[0]);
-
- }
-
- }
复制代码
1
|
|
|
|