J'essaie d'obtenir des données d'un capteur I2C (BNO055) en utilisant DMA, mais je ne peux pas démarrer la transmission DMA. J'ai trouvé beaucoup d'exemples pour les microcontrôleurs F1, F3 et F4 STM, mais rien d'utile pour F0. Ce que je fais est:STM32F0 découverte I2C transfert en utilisant DMA
- J'initialize capteur en utilisant la méthode de sondage et il fonctionne très bien.
- I initialiser DMA en utilisant le code suivant:
`
void I2C1_DMA_Init(uint8_t *BNO055_DMA_buffer)
{
RCC->AHBENR |= (RCC_AHBPeriph_DMA1);#
DMA_InitTypeDef DMA_str;
DMA_StructInit(&DMA_str);
DMA_str.DMA_PeripheralBaseAddr = (uint32_t)I2C1->RXDR;
DMA_str.DMA_MemoryBaseAddr = (uint32_t)BNO055_DMA_buffer;
DMA_str.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_str.DMA_BufferSize = 32;
DMA_str.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_str.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_str.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_str.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_str.DMA_Mode = DMA_Mode_Normal;
DMA_str.DMA_Priority = DMA_Priority_VeryHigh;
DMA_str.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_str);
}
`
- I Régler l'adresse correcte de la mémoire de capteur devant être lu à partir de l'utilisation méthode d'interrogation
- Maintenant, je voudrais lire 32 octets en utilisant DMA. Dois-je envoyer une adresse de capteur en utilisant la fonction
I2C_TransferHandling()
? Quels autres paramètres devraient être envoyés alors? Qu'est-ce que j'ai manqué à l'initialisation du DMA après l'exécution:
I2C_DMACmd(I2C1, I2C_DMAReq_Rx, ENABLE); DMA_Cmd(DMA1_Channel3, ENABLE);
Rien ne se passe sur le bus (je vérifie à l'aide d'un analyseur logique).