use interrupt based iic

This commit is contained in:
sdes1
2026-01-13 19:49:59 +01:00
parent 53b79389bf
commit 0a6f487746

View File

@@ -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;
}