Skip to main content
Graduate
July 1, 2024
Solved

I2C with DMA not working

  • July 1, 2024
  • 2 replies
  • 4737 views

Hi,

I'm somewhat new to STM32. I need to use DMA to collect data from a tempreture sensor over I2C.

My sensor is an Adafruit MCP 9600 and I'm using a Nucleo F446RE board. Following is the code I use. Can someone help as I've been stuck here for days without knowing what to do. 

 

uint8_t TMP_ADDR = 0x65 << 1;
uint8_t TMP_REG = 0x00;
uint8_t TempReading[100];

 

void MCP9600_ReadTemperatureDMA(void)
{
TempReading[0] = TMP_REG;
if (HAL_I2C_Master_Transmit(&hi2c1, TMP_ADDR, TempReading, 1, HAL_MAX_DELAY) == HAL_OK) {
if (HAL_I2C_Master_Receive_DMA(&hi2c1, TMP_ADDR, TempReading, sizeof(TempReading)) == HAL_OK) {
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
}
}
}

// I2C DMA Transfer Complete Callback
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
}

    This topic has been closed for replies.
    Best answer by Techn

    There is option in Mx tool , open ioc file. Look for dma type , select normal. 

    2 replies

    Super User
    July 1, 2024

    I2C without DMA works?

    Start perhaps with bit-banged I2C to check if the connections are OK.

    What are values of pullup resistors?

    JW

    sadeepTAAuthor
    Graduate
    July 1, 2024

    hey,

    Thanks for the reply.

    1. Yes. it works and gives me tepreture reading.

    2. I am not using any external pullups. Am I supposed to use it like that?

     

    Graduate II
    July 1, 2024

    I2C typically expects them. Internal pull-ups on STM32 pretty weak and slow, especially if presented a relatively large capacitive load..

    Get a scope or logic analyzer on the signals to better understand what's happening.

    You work with people with related competencies? Manager, supervisor, colleagues?

    sadeepTAAuthor
    Graduate
    July 1, 2024

    Thank you all. @Techn's idea solved my problem.