void TestTimers::check_RealTime() { CHECKTIME(art::hrRealTime,true); }
void TestTimers::check_stdclock() { CHECKTIME(std::clock,false); }
rt_err_t i2c_register_read(struct rt_i2c_bus_device *bus, rt_uint16_t daddr, rt_uint8_t raddr, void *buffer, rt_size_t count) { rt_int32_t ret; rt_tick_t tick=rt_tick_get(); #ifdef NO_RT_DEVICE rt_uint16_t NumByteToRead=count; rt_uint8_t * pBuffer=(rt_uint8_t *)buffer; rt_mutex_take(&I2C1_mutex,RT_WAITING_FOREVER); rt_enter_critical(); /* While the bus is busy */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) CHECKTIME(tick); /* Send START condition */ I2C_GenerateSTART(I2C1, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) CHECKTIME(tick); /* Send MPU6050 address for write */ I2C_Send7bitAddress(I2C1, daddr, I2C_Direction_Transmitter); /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) CHECKTIME(tick); /* Clear EV6 by setting again the PE bit */ I2C_Cmd(I2C1, ENABLE); /* Send the MPU6050's internal address to write to */ I2C_SendData(I2C1, raddr); /* Test on EV8 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) CHECKTIME(tick); /* Send STRAT condition a second time */ I2C_GenerateSTART(I2C1, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) CHECKTIME(tick); /* Send MPU6050 address for read */ I2C_Send7bitAddress(I2C1, daddr, I2C_Direction_Receiver); /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) CHECKTIME(tick); /* While there is data to be read */ while(NumByteToRead) { if(NumByteToRead == 1) { /* Disable Acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); } /* Test on EV7 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) CHECKTIME(tick); { /* Read a byte from the MPU6050 */ *pBuffer = I2C_ReceiveData(I2C1); /* Point to the next location where the byte read will be saved */ pBuffer++; /* Decrement the read bytes counter */ NumByteToRead--; } } /* Enable Acknowledgement to be ready for another reception */ I2C_AcknowledgeConfig(I2C1, ENABLE); // EXT_CRT_SECTION(); rt_exit_critical(); rt_mutex_release(&I2C1_mutex); #else struct rt_i2c_msg msgs[2]; RT_ASSERT(bus != RT_NULL); RT_ASSERT(buffer != RT_NULL); msgs[0].addr=daddr; msgs[0].buf=&raddr; msgs[0].len=1; msgs[0].flags=RT_I2C_WR|I2C_RA; msgs[1].addr=daddr; msgs[1].buf=buffer; msgs[1].len=count; msgs[1].flags=RT_I2C_RD|RT_I2C_NO_READ_ACK; err=rt_i2c_transfer(bus,msgs,2); #endif return RT_EOK; out: #ifdef NO_RT_DEVICE // I2C_GenerateSTOP(I2C1, ENABLE); rt_exit_critical(); rt_mutex_release(&I2C1_mutex); #endif return ret; }
rt_err_t i2c_register_write(struct rt_i2c_bus_device *bus, rt_uint16_t daddr, rt_uint8_t raddr, void *buffer, rt_size_t count) { rt_int32_t ret; rt_tick_t tick=rt_tick_get(); #ifdef NO_RT_DEVICE rt_uint8_t * pBuffer=(rt_uint8_t *)buffer; rt_mutex_take(&I2C1_mutex,RT_WAITING_FOREVER); rt_enter_critical(); I2C_GenerateSTART(I2C1, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) CHECKTIME(tick); /* Send MPU6050 address for write */ I2C_Send7bitAddress(I2C1, daddr, I2C_Direction_Transmitter); /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) CHECKTIME(tick); /* Send the MPU6050's internal address to write to */ I2C_SendData(I2C1, raddr); /* Test on EV8 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) CHECKTIME(tick); /* Send the byte to be written */ I2C_SendData(I2C1, *pBuffer); /* Test on EV8 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) CHECKTIME(tick); /* Send STOP condition */ I2C_GenerateSTOP(I2C1, ENABLE); rt_exit_critical(); rt_mutex_release(&I2C1_mutex); #else struct rt_i2c_msg msgs[2]; rt_err_t err; RT_ASSERT(bus != RT_NULL); RT_ASSERT(buffer != RT_NULL); if(count>1) { msgs[0].addr=daddr; msgs[0].buf=&raddr; msgs[0].len=1; msgs[0].flags=RT_I2C_WR; msgs[1].addr=daddr; msgs[1].buf=buffer; msgs[1].len=count; msgs[1].flags=RT_I2C_WR|RT_I2C_NO_START; err=rt_i2c_transfer(bus,msgs,2); } else { rt_uint8_t data[2]; data[0]=raddr; data[1]=*((rt_uint8_t *)buffer); msgs[0].addr=daddr; msgs[0].buf=data; msgs[0].len=2; msgs[0].flags=RT_I2C_WR; err=rt_i2c_transfer(bus,msgs,1); } #endif return RT_EOK; out: #ifdef NO_RT_DEVICE // I2C_GenerateSTOP(I2C1, ENABLE); rt_exit_critical(); rt_mutex_release(&I2C1_mutex); #endif return ret; }
rt_size_t i2c1_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) {int de=0; struct rt_i2c_msg *msg; rt_int32_t i, ret; rt_tick_t tick=rt_tick_get(); GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) CHECKTIME(tick); I2C_GenerateSTART(I2Cx, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) CHECKTIME(tick); for (i = 0; i < num; i++) {de=0; msg = &msgs[i]; if (!(msg->flags & RT_I2C_NO_START)) { if (i) { I2C_GenerateSTART(I2Cx, ENABLE); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) CHECKTIME(tick); }de=1; if (msg->flags & RT_I2C_RD) { I2C_Send7bitAddress(I2Cx, msg->addr, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) CHECKTIME(tick); } else { I2C_Send7bitAddress(I2Cx, msg->addr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) CHECKTIME(tick); } I2C_Cmd(I2Cx, ENABLE); } if (msg->flags & RT_I2C_RD) { ret = i2c1_recv_bytes(msg); if (ret >= 1) i2c_dbg("read %d byte%s\n", ret, ret == 1 ? "" : "s"); if (ret < msg->len) { if (ret >= 0) ret = -RT_EIO; goto out; } } else { nostart=(i+1<num && (msg[i+1].flags & RT_I2C_NO_START)) ||(msg[i].flags & I2C_RA); ret = stm32_i2c_send_bytes(msg); if (ret >= 1) i2c_dbg("write %d byte%s\n", ret, ret == 1 ? "" : "s"); if (ret < msg->len) { if (ret >= 0) ret = -RT_ERROR; goto out; } } } ret = i; return ret; out: de=-1; if(de==0)GPIO_ResetBits(GPIOB,GPIO_Pin_8);else if(de==1)GPIO_ResetBits(GPIOB,GPIO_Pin_9); i2c_dbg("error on stage %d\n",de); // I2C_GenerateSTOP(I2Cx, ENABLE); return ret; }