From 0a6f487746f01449df63c1729d4f8e3e8415440a Mon Sep 17 00:00:00 2001 From: sdes1 Date: Tue, 13 Jan 2026 19:49:59 +0100 Subject: [PATCH] use interrupt based iic --- src/APP/Aufgabe4/ps7/core0/src/imu.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/APP/Aufgabe4/ps7/core0/src/imu.c b/src/APP/Aufgabe4/ps7/core0/src/imu.c index 9bbb618..cbcdd39 100644 --- a/src/APP/Aufgabe4/ps7/core0/src/imu.c +++ b/src/APP/Aufgabe4/ps7/core0/src/imu.c @@ -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; }