use interrupt based iic
This commit is contained in:
@@ -38,6 +38,7 @@ int16_t angleBuffer[5000];
|
|||||||
|
|
||||||
static XIicPs Iic;
|
static XIicPs Iic;
|
||||||
XIicPs_Config *Config;
|
XIicPs_Config *Config;
|
||||||
|
OS_EVENT * iic_sem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Prototypes
|
* Function Prototypes
|
||||||
@@ -84,10 +85,14 @@ int mpu9250_Imu_Init(void *pdata){
|
|||||||
mpu9250_Write_Reg(26, 5); // gyro dlpf 10Hz
|
mpu9250_Write_Reg(26, 5); // gyro dlpf 10Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iic_isr_recv(){
|
||||||
|
OSSemPost(iic_sem);
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t mpu9250_Iic_Init(){
|
static uint8_t mpu9250_Iic_Init(){
|
||||||
Config = XIicPs_LookupConfig(IIC_DEVICE_ID) ;
|
Config = XIicPs_LookupConfig(IIC_DEVICE_ID) ;
|
||||||
XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);
|
XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);
|
||||||
|
iic_sem = OSSemCreate(1);
|
||||||
|
|
||||||
s32 err;
|
s32 err;
|
||||||
|
|
||||||
@@ -100,17 +105,26 @@ static uint8_t mpu9250_Iic_Init(){
|
|||||||
err = XIicPs_SetSClk(&Iic, 400000);
|
err = XIicPs_SetSClk(&Iic, 400000);
|
||||||
if(err != XST_SUCCESS)
|
if(err != XST_SUCCESS)
|
||||||
UCOS_Printf("failed to set i2c speed\r\n");
|
UCOS_Printf("failed to set i2c speed\r\n");
|
||||||
|
|
||||||
|
Iic.StatusHandler = iic_isr_recv;
|
||||||
|
UCOS_IntVectSet(XPS_I2C1_INT_ID, 0, 0, XIicPs_MasterInterruptHandler, &Iic);
|
||||||
|
UCOS_IntSrcEn(XPS_I2C1_INT_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t mpu9250_Write_Reg(uint8_t iic_address, uint8_t data){
|
static uint8_t mpu9250_Write_Reg(uint8_t iic_address, uint8_t data){
|
||||||
uint8_t tx_buf[] = {iic_address, data};
|
uint8_t tx_buf[] = {iic_address, data};
|
||||||
return XIicPs_MasterSendPolled(&Iic, tx_buf, sizeof(tx_buf), MPU9250_AD);
|
uint8_t err;
|
||||||
|
OSSemPend(iic_sem, 0, &err);
|
||||||
|
XIicPs_MasterSend(&Iic, tx_buf, sizeof(tx_buf), MPU9250_AD);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int8_t mpu9250_Read_Data(uint8_t iic_address, uint8_t length, u8 RecvBuffer []){
|
static int8_t mpu9250_Read_Data(uint8_t iic_address, uint8_t length, u8 RecvBuffer []){
|
||||||
s32 err = XIicPs_MasterSendPolled(&Iic, &iic_address, 1, MPU9250_AD);
|
uint8_t err;
|
||||||
if(err != XST_SUCCESS)
|
OSSemPend(iic_sem, 0, &err);
|
||||||
return -1;
|
XIicPs_MasterSend(&Iic, &iic_address, 1, MPU9250_AD);
|
||||||
return XIicPs_MasterRecvPolled(&Iic, RecvBuffer, length, MPU9250_AD);
|
OSSemPend(iic_sem, 0, &err);
|
||||||
|
XIicPs_MasterRecv(&Iic, RecvBuffer, length, MPU9250_AD);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user