# 功能與程式
主函式
```c=
int main(void)
{
RETARGET_Configuration();
I2CMaster_Configuration();
Who_Am_I_Value = MPU6500_I2C_Read_OneByte(0x75);
printf("Who am I Value : %02x\r\n", Who_Am_I_Value);
while(!(Who_Am_I_Value == 0x70));
Set_Acc_Scale_Select(mpu6500_range_2G);
Show_Acc_Scale_Select();
while (1){
Acc_Raw_Value[0] = Get_HL_Value(AccXH_Reg , AccXL_Reg);
Acc_Raw_Value[1] = Get_HL_Value(AccYH_Reg , AccYL_Reg);
Acc_Raw_Value[2] = Get_HL_Value(AccZH_Reg , AccZL_Reg);
printf("Acc%c --> Raw_Value_DEC: %05d , Raw_Value_HEX: %04x , Acc_Scale: %f\r\n",
Axis[0], Acc_Raw_Value[0], Acc_Raw_Value[0], Acc_Scale(Acc_Raw_Value[0]));
printf("Acc%c --> Raw_Value_DEC: %05d , Raw_Value_HEX: %04x , Acc_Scale: %f\r\n",
Axis[1], Acc_Raw_Value[1], Acc_Raw_Value[1], Acc_Scale(Acc_Raw_Value[1]));
printf("Acc%c --> Raw_Value_DEC: %05d , Raw_Value_HEX: %04x , Acc_Scale: %f\r\n",
Axis[2], Acc_Raw_Value[2], Acc_Raw_Value[2], Acc_Scale(Acc_Raw_Value[2]));
printf("\r\n");
for(i=0 ; i<0xFFFFF ; i++);
}
}
```
I2C設定
```c=
void I2CMaster_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
CKCUClock.Bit.I2C0 = 1;
CKCUClock.Bit.AFIO = 1;
CKCUClock.Bit.PB = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
AFIO_GPxConfig(GPIO_PB, AFIO_PIN_0, AFIO_MODE_7);
AFIO_GPxConfig(GPIO_PB, AFIO_PIN_1, AFIO_MODE_7);
GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_0, GPIO_PR_UP);
GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_1, GPIO_PR_UP);
I2C_InitStructure.I2C_GeneralCall = DISABLE;
I2C_InitStructure.I2C_AddressingMode = I2C_ADDRESSING_7BIT;
I2C_InitStructure.I2C_Acknowledge = DISABLE;
I2C_InitStructure.I2C_OwnAddress = I2C_MASTER_ADDRESS;
I2C_InitStructure.I2C_Speed = ClockSpeed;
I2C_InitStructure.I2C_SpeedOffset = 0;
I2C_Init(HT_I2C0, &I2C_InitStructure);
I2C_Cmd(HT_I2C0, ENABLE);
}
```
#### 根據MPU Datasheet 設置參數
1. 讀取資料
```c=
u8 MPU6500_I2C_Read_OneByte(u8 reg_addr)
{
u8 receive_data = 0;
while (I2C_ReadRegister(HT_I2C0, I2C_REGISTER_SR)&0x80000);
I2C_AckCmd(HT_I2C0, ENABLE);
I2C_TargetAddressConfig(HT_I2C0, I2C_SLAVE_ADDRESS, I2C_MASTER_WRITE);
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_SEND_START));
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_TRANSMITTER_MODE));
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_TX_EMPTY));
I2C_SendData(HT_I2C0, reg_addr);
I2C_TargetAddressConfig(HT_I2C0, I2C_SLAVE_ADDRESS, I2C_MASTER_READ);
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_SEND_START));
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_RECEIVER_MODE));
I2C_AckCmd(HT_I2C0, DISABLE);
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_RX_NOT_EMPTY));
receive_data = I2C_ReceiveData(HT_I2C0);
I2C_GenerateSTOP(HT_I2C0);
return receive_data;
}
```
2. 寫出資料
```c=
void MPU6500_I2C_Write_OneByte(u8 reg_addr, u8 register_value)
{
while (I2C_ReadRegister(HT_I2C0, I2C_REGISTER_SR)&0x80000);
I2C_AckCmd(HT_I2C0, ENABLE);
I2C_TargetAddressConfig(HT_I2C0, I2C_SLAVE_ADDRESS, I2C_MASTER_WRITE);
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_SEND_START));
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_TRANSMITTER_MODE));
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_TX_EMPTY));
I2C_SendData(HT_I2C0, reg_addr);
while (!I2C_CheckStatus(HT_I2C0, I2C_MASTER_TX_EMPTY));
I2C_SendData(HT_I2C0, register_value);
I2C_GenerateSTOP(HT_I2C0);
}
```
```c=
oid Set_Acc_Scale_Select(u8 scale)
{
u8 scale_data;
scale_data = (MPU6500_I2C_Read_OneByte(Acc_Config_Reg) & 0xE7) | scale;
MPU6500_I2C_Write_OneByte(Acc_Config_Reg, scale_data);
}
void Show_Acc_Scale_Select(void)
{
u8 scale;
scale = MPU6500_I2C_Read_OneByte(Acc_Config_Reg) & 0x18;
switch(scale)
{
case mpu6500_range_2G:
printf("Acc_Scale_Status: +-2G\r\n");
break;
case mpu6500_range_4G:
printf("Acc_Scale_Status: +-4G\r\n");
break;
case mpu6500_range_8G:
printf("Acc_Scale_Status: +-8G\r\n");
break;
case mpu6500_range_16G:
printf("Acc_Scale_Status: +-16G\r\n");
break;
default:
printf("Acc_Scale_Status: error\r\n");
break;
}
}
u16 Get_HL_Value(u8 high_reg, u8 low_reg)
{
u8 h_Value, l_Value;
h_Value = MPU6500_I2C_Read_OneByte(high_reg);
l_Value = MPU6500_I2C_Read_OneByte(low_reg);
/* h_value left 8 bits or l_value = (h_value+l_value)*/
return (((u16)h_Value << 8) | l_Value);
}
```
```c=
double Acc_Scale(u16 raw_value)
{
u8 scale;
double per_digit;
scale = MPU6500_I2C_Read_OneByte(Acc_Config_Reg) & 0x18;
switch(scale)
{
case mpu6500_range_2G:
per_digit = 2.0/0x8000;
break;
case mpu6500_range_4G:
per_digit = 4.0/0x8000;
break;
case mpu6500_range_8G:
per_digit = 8.0/0x8000;
break;
case mpu6500_range_16G:
per_digit = 16.0/0x8000;
break;
default:
break;
}
return ((signed short)raw_value * per_digit);
}
```