Sou muito novo em usar as bibliotecas CUBE e HAL do STM. Estou usando um microcontrolador STM32F0 com 32 pinos. O esquema do I2C está correto. Então, preciso de uma ajudinha aqui.
Eu tenho um sensor capacitivo ( FDC1004 ) que usa comunicação I2C. Eu tenho que escrever esses registros para ler os dados.
Como enviar corretamente o mestre do formulário de solicitação START para o escravo (o endereço do escravo é A0)?
Como definir o ponteiro para o registro 0x0C?
- A folha de dados vê (Registre-se 0x0C: bit [7: 4]) para 1.) Não sei, como fazer isso? E, finalmente, como ler a partir do mesmo registro?
- Além disso, tenho que esperar o campo DONE_x (registre 0x0C: bits [3: 0]) antes de ler?
Mas não sei se estou abordando os registros corretos! Porque não recebo dados do sensor!
Aqui está o meu código:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
fonte
fonte
Respostas:
Vamos começar com a
HAL_I2C_Master_Transmit()
função Se você verificar sua declaração:Problema menor com o 2º parâmetro, o endereço do dispositivo escravo. O endereço do dispositivo escravo é
b1010000
que, se o completarmos no formato 8 bits, será0xA0
, exatamente como você disse. Agora, ao passar isso paraHAL_I2C_Master_Transmit()
você, você não precisa definir o bit R / W manualmente, o HAL fará isso por você. Portanto, quando você chamarHAL_I2C_Master_Transmit()
o bit R / W transmitido, será automaticamente 0 indicando a operação de gravação e quando você chamarHAL_I2C_Master_Receive()
o bit R / W transmitido será automaticamente 1, indicando a operação de gravação . Você misturou os valores de R / W, mas acho que não é um problema para a função, portanto, não é um erro real no seu código.O terceiro parâmetro (
uint8_t *pData
) é um ponteiro para um buffer que contém os dados a serem enviados . Agora, na sua chamada, o terceiro parâmetro é0x0C
quais são seus dados reais, o endereço de registro. O problema é que ele será interpretado como um ponteiro (peloHAL_I2C_Master_Transmit()
) para um local de memória, onde alguns dados indefinidos podem ser encontrados.O quarto parâmetro é o tamanho do buffer , o número de bytes a serem enviados. Se você deseja enviar um único byte, esse parâmetro deve ser 1 e não 10.
Gravar registros
Aqui está o diagrama correspondente da folha de dados.
Então, depois de enviar o endereço escravo para o barramento, mais três bytes devem ser transmitidos: ponteiro de registro , byte MSB , byte LSB . Uma implementação geral com registros HAL de gravação de 16 bits:
Exemplo com seus valores:
write_register(0x0C, 0x0054);
Como alternativa, também pode ser usada a função de gravação de registro definida pelo HAL, que possui parâmetros adicionais para a passagem do endereço e tamanho do endereço.
Agora, a
HAL_I2C_Master_Receive()
função é quase a mesma que a outra.A única diferença é que o terceiro parâmetro é um ponteiro para o buffer em que os dados recebidos serão armazenados. Ele está
0x02
no seu código e não sei qual era o seu objetivo, mas será interpretado como um ponteiro (infelizmente para um local de memória aleatória).Ler registros
Exemplo:
Também existe uma função de leitura de registro definida pelo HAL, que possui.
Leia a seção 8.5 Programação da folha de dados para obter mais detalhes.
fonte