こんにちは、私たちはiMx8QMで行われたアプリケーションを開発するためにMIMXRT1064-EVKボードを手に入れました、今回はSPIです、私は他のボード(ラズベリー(raspi-os)、arduino uno(arduino)、esp8266(arduino))と通信しようとb2b_master例を使用しましたが、SPIでMIMXRT1064をマスターまたはスレーブとして機能させることはできませんでした。
オシロスコープを使用して、送信中にMIMXRT1064がSCKピンにクロックを出力せず、arduinoヘッダーのSPIピンのいずれにもアクティビティがまったくないことに気付きました。私は与えられた例で試し、それを機能させようとして修正することによって、SPIが機能しない理由が何であるかについての手がかりはありますか?
これは、SPIでメッセージを継続的(時間間隔)送信するためだけにfreertos_lpspi_b2b_masterのわずかに変更されたコードです。
/*
* Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
/* Freescale includes. */
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "fsl_lpspi.h"
#include "fsl_lpspi_freertos.h"
#include "board.h"
#include "app.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define TRANSFER_SIZE (16U) /*! Transfer dataSize.*/
#define TRANSFER_BAUDRATE (500000U) /*! Transfer baudrate - 500k */
/*******************************************************************************
* Prototypes
******************************************************************************/
/* LPSPI user callback */
extern uint32_t LPSPI_GetInstance(LPSPI_Type *base);
/*******************************************************************************
* Variables
******************************************************************************/
lpspi_slave_handle_t g_s_handle;
uint8_t masterReceiveBuffer[TRANSFER_SIZE] = {0};
uint8_t masterSendBuffer[TRANSFER_SIZE] = {0};
uint8_t slaveSendBuffer[TRANSFER_SIZE] = {0};
SemaphoreHandle_t lpspi_sem;
/*******************************************************************************
* Definitions
******************************************************************************/
/* Task priorities. */
#define master_task_PRIORITY (configMAX_PRIORITIES - 1)
/*******************************************************************************
* Prototypes
******************************************************************************/
static void master_task(void *pvParameters);
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief Application entry point.
*/
int main(void)
{
int i;
/* Init board hardware. */
BOARD_InitHardware();
PRINTF("FreeRTOS LPSPI master example starts.\r\n");
PRINTF("This example uses two boards to connect with one as master and anohter as slave.\r\n");
PRINTF("Master and slave are both use interrupt way.\r\n");
PRINTF("Please make sure you make the correct line connection. Basically, the connection is:\r\n");
PRINTF("LPSPI_master -- LPSPI_slave\r\n");
PRINTF(" CLK -- CLK\r\n");
PRINTF(" PCS -- PCS\r\n");
PRINTF(" SOUT -- SIN\r\n");
PRINTF(" SIN -- SOUT\r\n");
PRINTF("\r\n");
/* Initialize data in transfer buffers */
for (i = 0; i < TRANSFER_SIZE; i++)
{
masterSendBuffer[i] = i % 256;
masterReceiveBuffer[i] = 0;
slaveSendBuffer[i] = ~masterSendBuffer[i];
}
if (xTaskCreate(master_task, "Master_task", configMINIMAL_STACK_SIZE + 64, NULL, master_task_PRIORITY, NULL) !=
pdPASS)
{
PRINTF("Task creation failed!.\r\n");
while (1)
;
}
vTaskStartScheduler();
for (;;)
;
}
/*!
* @brief Task responsible for master SPI communication.
*/
static void master_task(void *pvParameters)
{
lpspi_transfer_t masterXfer;
lpspi_rtos_handle_t master_rtos_handle;
lpspi_master_config_t masterConfig;
status_t status;
LPSPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate = TRANSFER_BAUDRATE;
masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT;
status = LPSPI_RTOS_Init(&master_rtos_handle, EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, LPSPI_MASTER_CLK_FREQ);
if (status != kStatus_Success)
{
PRINTF("LPSPI master: error during initialization. \r\n");
vTaskSuspend(NULL);
}
/*Start master transfer*/
masterXfer.txData = masterSendBuffer;
masterXfer.rxData = masterReceiveBuffer;
masterXfer.dataSize = TRANSFER_SIZE;
masterXfer.configFlags = EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_SlaveByteSwap;
for(int j=0; j<100; j++){
status = LPSPI_RTOS_Transfer(&master_rtos_handle, &masterXfer);
if (status == kStatus_Success)
{
PRINTF("LPSPI master transfer completed successfully.\r\n");
}
else
{
PRINTF("LPSPI master transfer completed with error.\r\n");
}
vTaskDelay(1000);
}
vTaskSuspend(NULL);
}E から他のデバイスへの通信は機能しますが、問題は MIMX ボードだけであることに注意してください