STM32 NUCLEO F446RE の SPI 経由でAMS AS5050A磁気エンコーダーから値を読み取ろうとしていますが、動作させることができません。HAL ライブラリを使用すると、出力は常に 0 になります。周辺機器の設定は次のとおりです。
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
これまでの私のコードは次のとおりです。
HAL_StatusTypeDef ret = 0;
short address = AMS_AS5050A_create_command(AMS_AS5050A_SPI_READ, 0x3FFF);
// pull slave select pin low
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
//transmit data
ret = HAL_SPI_Transmit(&hspi3, (uint8_t *) &address, 2, HAL_MAX_DELAY);
// pull slave select pin high
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
sprintf(buf, "[MAIN] test transmit returned code: %d\r\n", ret);
UART_send(buf);
HAL_Delay(50);
uint16_t temp_data = 0;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
ret = HAL_SPI_Receive(&hspi3, (uint8_t*) &temp_data, 2,
HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
sprintf(buf, "[MAIN] test receive returned code: %d\r\n", ret);
UART_send(buf);
sprintf(buf, "[MAIN] test transmit and receive angle is: %d\r\n",
temp_data);
UART_send(buf);
HAL_Delay(50);
このAMS_AS5050A_create_command
関数は、短いコマンドに読み取り/書き込みビットを追加し、パリティ ビットを追加します。これは正しいコマンド0x3FFF
で使用されます。0xFFFF
次のようになります。
short AMS_AS5050A_create_command(uint8_t read_write, short address)
{
short data = read_write << 15;
data |= (address << 1);
short res = data | calculate_parity(data);
return res;
}
PuTTy の出力を見ると、出力は常に 0 です。関数はエラー コードを表示しませんが、SPI 読み取りコマンドからの出力は常に 0 です。前に磁石を置いても、次のようになります。
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
私が間違っていることを知っている人はいますか?