static void _i2cTask(void *parameters) { while(1){ struct _i2cMessage message; xQueueReceive(_rxTxQueue, &message, portMAX_DELAY); // get data to send xSemaphoreTake(_i2cHrdSemaphore, portMAX_DELAY); // wait for DMA to be free, useful think for a future if(message.rxFlag){ _i2cRead(&message); }else{ _i2cWrite(&message); } xSemaphoreGive(_i2cHrdSemaphore); vTaskDelay(1/portTICK_RATE_MS); //Then go sleep } }
enum Error i2cReadFromSlaveT(uint16_t addr, char *string, uint8_t lenght, portTickType ticks_to_wait) { struct _i2cMessage message; //lets initialize new message message.length = lenght; message.addr=addr; message.rxFlag=RX_FLAG; message.sendMessTaskHandle=xTaskGetCurrentTaskHandle(); message.string=string; enum Error error; if (message.length == 0) return ERROR_NONE; if(message.sendMessTaskHandle != NULL){ portBASE_TYPE ret = xQueueSend(_rxTxQueue, &message, ticks_to_wait);//add new message to a RXTX queue error = errorConvert_portBASE_TYPE(ret); vTaskSuspend(NULL);//a task which is reading something from I2C slave need to wait for an answer } else{ //in case it would be call not from a task _i2cRead(&message); } return error; }
// i2cReadRegister - Reads the specified amount of data from the given register address on // the specified I2C address bool i2cReadRegister(uint8_t addr, uint8_t reg, uint8_t *value, uint16_t count) { i2cState.status |= I2C_STATUS_NOSTOP; // Write out the location we want and read in data return _i2cWrite(addr, ®, 1) && _i2cRead(addr, value, count); }
// i2cRead - Reads the specified number of data bytes from the specified address bool i2cRead(uint8_t addr, uint8_t *data, uint16_t count) { return _i2cRead(addr, data, count); }