Example #1
0
/** \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 Lê a memoria do esc.
  * Retorna o \b 1 caso de sucesso.
  *
  * @param  ID ID do esc.
  * @retval \b 1 se sucesso.
  */
int  c_io_blctrl_updateBuffer(uint8_t ID)
{
  int i=0;
  for(i=0;i<BLCTRL_BUFFER_SIZE;i++)
  {
    c_common_i2c_start(ID<<1, I2C_Direction_Receiver);
    blctrl_buffer[i]=c_common_i2c_readNack();
    int b=0;
    for(b=0;b<1000;b++); // gastar tempo para conseguir ler varios enderecos
  }
  
  return 1;
}
/** \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;
  }

}
Example #4
0
/** \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);
}