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)

 

posted @ 2018-05-22 11:55  LLWDream  阅读(610)  评论(0编辑  收藏  举报