use interrupt based iic
This commit is contained in:
@@ -38,6 +38,7 @@ int16_t angleBuffer[5000];
|
||||
|
||||
static XIicPs Iic;
|
||||
XIicPs_Config *Config;
|
||||
OS_EVENT * iic_sem;
|
||||
|
||||
/**
|
||||
* Function Prototypes
|
||||
@@ -84,10 +85,14 @@ int mpu9250_Imu_Init(void *pdata){
|
||||
mpu9250_Write_Reg(26, 5); // gyro dlpf 10Hz
|
||||
}
|
||||
|
||||
void iic_isr_recv(){
|
||||
OSSemPost(iic_sem);
|
||||
}
|
||||
|
||||
static uint8_t mpu9250_Iic_Init(){
|
||||
Config = XIicPs_LookupConfig(IIC_DEVICE_ID) ;
|
||||
XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);
|
||||
iic_sem = OSSemCreate(1);
|
||||
|
||||
s32 err;
|
||||
|
||||
@@ -100,17 +105,26 @@ static uint8_t mpu9250_Iic_Init(){
|
||||
err = XIicPs_SetSClk(&Iic, 400000);
|
||||
if(err != XST_SUCCESS)
|
||||
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){
|
||||
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 []){
|
||||
s32 err = XIicPs_MasterSendPolled(&Iic, &iic_address, 1, MPU9250_AD);
|
||||
if(err != XST_SUCCESS)
|
||||
return -1;
|
||||
return XIicPs_MasterRecvPolled(&Iic, RecvBuffer, length, MPU9250_AD);
|
||||
uint8_t err;
|
||||
OSSemPend(iic_sem, 0, &err);
|
||||
XIicPs_MasterSend(&Iic, &iic_address, 1, MPU9250_AD);
|
||||
OSSemPend(iic_sem, 0, &err);
|
||||
XIicPs_MasterRecv(&Iic, RecvBuffer, length, MPU9250_AD);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user