novoton-I2C使用
Posted LLWDream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了novoton-I2C使用相关的知识,希望对你有一定的参考价值。
I2C协议
I2C硬件驱动(分中断模式和非中断模式)
使能外设时钟,时钟源默认值:
CLK_EnableModuleClock(I2C1_MODULE);
配置外设引脚:
/* I2C1: GPE0=SDA, GPC4=SCL*/
SYS->GPE_MFPL &= ~SYS_GPE_MFPL_PE0MFP_Msk;
SYS->GPE_MFPL |= SYS_GPE_MFPL_PE0MFP_I2C1_SDA;
SYS->GPC_MFPL &= ~SYS_GPC_MFPL_PC4MFP_Msk;
SYS->GPC_MFPL |= SYS_GPC_MFPL_PC4MFP_I2C1_SCL;
初始化外设:
/* Init I2C1 to 50Khz for MPU6050 */
I2C_Open(I2C1, 50000);
使用外设1:
void Init_MPU6050(void)
{
I2C_SetSlaveAddr(MPU6050_I2C_PORT, 0, MPU6050_SlaveAddr, I2C_GCMODE_DISABLE);
I2C_SingleWrite(MPU6050_PWR_MGMT_1, 0x00); // CLL_SEL=0: internal 8MHz, TEMP_DIS=0, SLEEP=0
I2C_SingleWrite(MPU6050_SMPLRT_DIV, 0x07); // Gyro output sample rate = Gyro Output Rate/(1+SMPLRT_DIV)
I2C_SingleWrite(MPU6050_CONFIG, 0x06); // set TEMP_OUT_L, DLPF=2 (Fs=1KHz)
I2C_SingleWrite(MPU6050_GYRO_CONFIG, 0x18); // bit[4:3] 0=+-250d/s,1=+-500d/s,2=+-1000d/s,3=+-2000d/s
I2C_SingleWrite(MPU6050_ACCEL_CONFIG, 0x01);// bit[4:3] 0=+-2g,1=+-4g,2=+-8g,3=+-16g, ACC_HPF=On (5Hz)
}
使用外设2:
uint16_t Read_MPU6050_AccX(void)
{
uint8_t LoByte, HiByte;
LoByte = I2C_SingleRead(MPU6050_ACCEL_XOUT_L); // read Accelerometer X_Low value
HiByte = I2C_SingleRead(MPU6050_ACCEL_XOUT_H); // read Accelerometer X_High value
return ((HiByte<<8) | LoByte);
}
用户函数:
1 void I2C_SingleWrite(uint8_t index, uint8_t data) 2 { 3 I2C_START(MPU6050_I2C_PORT); 4 I2C_WAIT_READY(MPU6050_I2C_PORT); 5 6 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x08); 7 8 I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr); 9 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 10 I2C_WAIT_READY(MPU6050_I2C_PORT); 11 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x18); 12 13 I2C_SET_DATA(MPU6050_I2C_PORT, index); 14 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 15 I2C_WAIT_READY(MPU6050_I2C_PORT); 16 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28); 17 18 I2C_SET_DATA(MPU6050_I2C_PORT, data); 19 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 20 I2C_WAIT_READY(MPU6050_I2C_PORT); 21 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28); 22 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI|I2C_CTL_STO); 23 } 24 25 uint8_t I2C_SingleRead(uint8_t index) 26 { 27 uint8_t tmp; 28 I2C_START(MPU6050_I2C_PORT); 29 I2C_WAIT_READY(MPU6050_I2C_PORT); 30 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x08); 31 32 I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr); 33 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 34 I2C_WAIT_READY(MPU6050_I2C_PORT); 35 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x18); 36 37 I2C_SET_DATA(MPU6050_I2C_PORT, index); 38 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 39 I2C_WAIT_READY(MPU6050_I2C_PORT); 40 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28); 41 42 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_STA | I2C_CTL_SI); 43 I2C_WAIT_READY(MPU6050_I2C_PORT); 44 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x10); 45 46 I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr+1); 47 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI); 48 I2C_WAIT_READY(MPU6050_I2C_PORT); 49 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x40); 50 51 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT,I2C_CTL_SI); 52 I2C_WAIT_READY(MPU6050_I2C_PORT); 53 while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x58); 54 55 tmp = I2C_GET_DATA(MPU6050_I2C_PORT); 56 58 I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI|I2C_CTL_STO); 59 60 return tmp; 61 }
相关库函数:
void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode);
* @param[in] i2c Specify I2C port
* @param[in] u8SlaveNo Set the number of I2C address register (0~3)
* @param[in] u8SlaveAddr 7-bit slave address
* @param[in] u8GCMode Enable/Disable GC mode (I2C_GCMODE_ENABLE / I2C_GCMODE_DISABLE)
以上是关于novoton-I2C使用的主要内容,如果未能解决你的问题,请参考以下文章