1

HAL_I2C_Mem_Write_DMA / HAL_I2C_Mem_Read_DMA 何が問題ですか?

こんにちは、LIS35 (加速度計) を使用して DMA モードで I2C を実行しようとしています。以下のように簡単なコードを書きましたが、実行またはデバッグしようとするたびに、「LIS35_ERROR;」が返されます。これは、LIS35_I2C_Init(void) 関数がうまくいかないことを意味します。

以前 (つまり昨日)、私は 2 つの同様のプロジェクトを書きました。

最初は HAL_I2C_Mem_Write / HAL_I2C_Mem_Read 関数に基づいていました - そしてすべてが適切に動作します (LIS35_OK を返します;)

2 番目は HAL_I2C_Mem_Write_IT / HAL_I2C_Mem_Read_IT 関数に基づいていて、すべて正常に動作します (LIS35_OK を返す;)

環境:

  • STM32CubeMX - 本日更新、
  • ボード - Nucleo-F103RB
  • 添付ファイルとして追加された CubeMX プロジェクト
  • 下の写真のI2C構成

ここに画像の説明を入力

ここに画像の説明を入力

/* USER CODE BEGIN 4 */
char LIS35_I2C_Init(void)
{
uint8_t Sett_Lis35_cr2_boot = LIS35_REG_CR2_BOOT;
uint8_t RegVal, LIS35Settings; 
HAL_StatusTypeDef state1, state2, state3;
volatile long int i;



//reset LIS35 settings
if(HAL_I2C_Mem_Write_DMA(&hi2c2, LIS35_Addr, LIS35_REG_CR2, 1, &Sett_Lis35_cr2_boot, 1) != HAL_OK) {
   //led blink info
}
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY){}



//Write settings - activate all axis
LIS35Settings = LIS35_REG_CR1_XEN | LIS35_REG_CR1_YEN | LIS35_REG_CR1_ZEN | LIS35_REG_CR1_ACTIVE; 

//WRITE CONFIGURATION TO LIS35 CHIP
if(HAL_I2C_Mem_Write_DMA(&hi2c2, LIS35_Addr, LIS35_REG_CR1, 1, &LIS35Settings, 1)!= HAL_OK) {
   //led blink info
}
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY){} 

//Read configuration - if OK, LIS35 is up and running
if(HAL_I2C_Mem_Read_DMA(&hi2c2, LIS35_Addr, LIS35_REG_CR1, 1, &RegVal, 1) != HAL_OK) {
   //led blink info

}
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY){}

if (RegVal == LIS35Settings){
   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
   return LIS35_OK;
}
return LIS35_ERROR;
}

void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c){
static uint8_t cntTx;
cntTx++;
}

void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c){
static uint8_t cntRx;
cntRx++;
}

/* USER CODE END 4 */

助けてくれてありがとう:-)

ファーンク

4

0 に答える 0