Пример #1
0
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
	}
}
Пример #2
0
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;
}
Пример #3
0
// 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, &reg, 1) && _i2cRead(addr, value, count);
}
Пример #4
0
// 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);
}