/** \brief Lê uma quantidade de bytes de um dado endereço em um determinado dispositivo. * * Exemplo: lê 1 byte a partir do endereço de memória 0x00 do dispositivo com endereço * 0x68 no barramento, e salva o resultado em ITG3205_ID. * \code{.c} * c_common_i2c_readBytes(0x68, 0x00, 1, &ITG3205_ID); * \endcode * * @param I2Cx I2C a ser utilizada. * @param device Endereço do dispositivo no barramento. * @param address Endereço de memória a ser lido (comando antes da leitura). * @param bytesToRead Quantos bytes são esperados. * @param recvBuffer Ponteiro para um buffer com tamanho mínimo de \b bytesToRead, no qual a resposta será armazenada. * */ void c_common_i2c_readBytes(I2C_TypeDef* I2Cx, uint8_t device, uint8_t address, char bytesToRead, uint8_t * recvBuffer) { c_common_i2c_start(I2Cx, device<<1, I2C_Direction_Transmitter); c_common_i2c_write(I2Cx, address); c_common_i2c_stop(I2Cx); c_common_i2c_start(I2Cx, device<<1, I2C_Direction_Receiver); for(int i=0; i<bytesToRead-1; i++) recvBuffer[i] = c_common_i2c_readAck(I2Cx); recvBuffer[bytesToRead-1] = c_common_i2c_readNack(I2Cx); c_common_i2c_stop(I2Cx); }
/** \brief Seta a velocidade desejada, em rpm. * Retorna \b 1 em caso de sucesso. * Retorna \b -1 em caso de falha. * * @param ID ID do esc. * @param speed velocidade em rpm. * @retval sucesso ou nao. */ int c_io_blctrl_setSpeed(uint8_t ID, int speed) { //RPM = raw * 780 / no. of magnets int raw = (int) speed*BLCTRL_NUM_OF_MAGNETS/780; if(raw<=255 && raw>=0) { c_common_i2c_start(ID<<1, I2C_Direction_Transmitter); c_common_i2c_write((uint8_t) raw); c_common_i2c_stop(); return 1; } else { return -1; } }
/** \brief Escreve um byte num dispositivo com um dado endereço. * * @param I2Cx I2C a ser utilizada. * @param device Endereço do dispositivo no barramento. * @param address Endereço a ser escrito no dispositivo. * @param byteToWrite Byte a ser escrito. */ void c_common_i2c_writeByte(I2C_TypeDef* I2Cx, uint8_t device, uint8_t address, uint8_t byteToWrite) { c_common_i2c_start(I2Cx, device<<1, I2C_Direction_Transmitter); c_common_i2c_write(I2Cx, address); c_common_i2c_write(I2Cx, byteToWrite); c_common_i2c_stop(I2Cx); }