TC397 SPI_DMA_1_KIT_TC397_TFT デモ中 关于SPI

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

请问当SPI Master 或slave传输数据时 使用 IfxQspi_SpiMaster_getStatus到的状态为busy时,有没有办法清除掉此状态? 2.现在发送数据和接收数据时,有时正常,有时处于busy状态,发送接收数据失败,出现此问题的原因?

多谢!

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Bertxu

我觉得可能跟硬件有关,代码保持原样,同时将マスター和Slave各个引脚连接后,用示波器或者逻辑分析仪看一下MTSR脚的的的变化过程。

ブラジル、

ジェレミー

元の投稿で解決策を見る

0 件の賞賛
6 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Bertxu 、

1)请问当SPI Master 或slave传输数据时 使用 IfxQspi_SpiMaster_getStatus到的状态为busy时,有没有办法清除掉此状态?

-- 没有,因为这个信号量用于同步传输过程是否完成。

2)你的意思是TC397 SPI_DMA_1_KIT_TC397_TFT工程运行过程跟预期不一致?

ブラジル、

ジェレミー

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

TC397 SPI_DMA_1_KIT_TC397_TFT 使用此demo时,我们把slave端在code中移除,只留master端,物理连接也把master与slave端断开,此时让master 端发送数据,现在spi的clock用示波器能量到,但MOSI对应的pin只能量到3V不变化,理论上有发送数据就应该能量到data pin的变化,这是什么原因造成的?

看log 没发现异常:如下

08:55:22.884]收←◆1A 55 55 55 55 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 2A 77 FF FF

1A,2A--------触发中断时发的(IfxQspi_SpiMaster_exchange执行此函数)

55 55 55 55 为发送数据。

77 77 77 77 77 77 ........(SpiMaster busy时的等待)

FF FF FF FF 为 Master接收数据

对应的コード:


/*-----------------------------------------------------含む------------------------------------------------------*/
/*********************************************************************************************************************/
#include "SPI_DMA.h"
#include "IfxPort.h"
#include "ASCLIN_UART.h"
#include < Qspi/SpiSlave/IfxQspi_SpiSlave.h>
#include "Bsp.h"
/*********************************************************************************************************************/
/*------------------------------------------------------マクロ-------------------------------------------------------*/
/*********************************************************************************************************************/
#define QSPI2_MASTER &MODULE_QSPI2 /* SPI マスタ ハードウェア モジュール */
#define QSPI3_SLAVE &MODULE_QSPI3 /* SPI スレーブ ハードウェア モジュール */

#define LED_D110 &MODULE_P13,3 /* LED D110 ポート、ピン定義 */

#define ISR_PRIORITY_QSPI2_TX 1 /* QSPI2 送信割り込み優先度を定義します */
#define ISR_PRIORITY_QSPI2_RX 2 /* QSPI2 受信割り込み優先度を定義する */
#define ISR_PRIORITY_QSPI2_ER 10 /* QSPI2 エラー割り込み優先度を定義する */

#define ISR_PRIORITY_QSPI3_TX 3 /* QSPI3 送信割り込み優先度を定義します */
#define ISR_PRIORITY_QSPI3_RX 4 /* QSPI3 受信割り込み優先度を定義する */
#define ISR_PRIORITY_QSPI3_ER 11 /* QSPI3 エラー割り込み優先度を定義する */

#define ISR_PRIORITY_DMA_CH1 50 /* DMA チャネル 1 割り込み優先度を定義する */
#define ISR_PRIORITY_DMA_CH2 51 /* DMA チャネル 2 割り込み優先度を定義する */
#define ISR_PRIORITY_DMA_CH3 52 /* DMA チャネル 3 割り込み優先度を定義する */
#define ISR_PRIORITY_DMA_CH4 53 /* DMA チャネル 4 割り込み優先度を定義する */

#define ISR_PROVIDER_QSPI2 IfxSrc_Tos_cpu0 /* QSPI2 割り込みプロバイダを定義します */
#define ISR_PROVIDER_QSPI3 IfxSrc_Tos_cpu0 /* QSPI3 割り込みプロバイダを定義します */

#define ISR_PROVIDER_DMA_CH1 IfxSrc_Tos_cpu0 /* DMA チャネル 1 割り込みプロバイダを定義します */
#define ISR_PROVIDER_DMA_CH2 IfxSrc_Tos_cpu0 /* DMA チャネル 2 割り込みプロバイダを定義します */
#define ISR_PROVIDER_DMA_CH3 IfxSrc_Tos_cpu0 /* DMA チャネル 3 割り込みプロバイダを定義します */
#define ISR_PROVIDER_DMA_CH4 IfxSrc_Tos_cpu0 /* DMA チャネル 4 割り込みプロバイダを定義します */

#define MASTER_CHANNEL_BAUDRATE 1000000 /* マスターチャンネルボーレート */
#define GPIOp220 &MODULE_P22,0
/*********************************************************************************************************************/
/*-------------------------------------------------グローバル変数--------------------------------------------------*/
/*********************************************************************************************************************/
qspiDma g_qspiDma;/* QSPI 通信のグローバル ハンドル */
uint32 k;
/*********************************************************************************************************************/
/*------------------------------------------------関数プロトタイプ------------------------------------------------*/
/*********************************************************************************************************************/
静的ボイド初期化QSPI2マスター(ボイド);
static void initQSPI2MasterChannel(void);
static void initQSPI2MasterBuffers(void);
静的ボイドinitQSPI3スレーブ(ボイド);
static void initQSPI3SlaveBuffers(void);
静的ボイド初期化QSPI(ボイド);
静的ボイド初期化LED(ボイド);

/*********************************************************************************************************************/
/*---------------------------------------------関数の実装----------------------------------------------*/
/*********************************************************************************************************************/
IFX_INTERRUPT(QSPI2ErrorISR, 0, ISR_PRIORITY_QSPI2_ER);/* SPI マスタ エラー割り込みの定義 */
IFX_INTERRUPT(QSPI3ErrorISR, 0, ISR_PRIORITY_QSPI3_ER);/* SPI スレーブ エラー割り込みの定義 */
IFX_INTERRUPT(DMAChn1ISR, 0, ISR_PRIORITY_DMA_CH1);/* DMA チャネル 1 割り込み定義 */
IFX_INTERRUPT(DMAChn2ISR, 0, ISR_PRIORITY_DMA_CH2);/* DMA チャネル 2 割り込み定義 */
IFX_INTERRUPT(DMAChn3ISR, 0, ISR_PRIORITY_DMA_CH3);/* DMA チャネル 3 割り込み定義 */
IFX_INTERRUPT(DMAChn4ISR, 0, ISR_PRIORITY_DMA_CH4);/* DMA チャンネル 4 割り込み定義 */

/* QSPI2 エラー割り込みを処理します */
void QSPI2ErrorISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiMaster_isrError(&g_qspiDma.spiMaster);
}

/* QSPI3 エラー割り込みを処理します */
void QSPI3ErrorISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiSlave_isrError(&g_qspiDma.spiSlave);
}


/* DMA チャネル 1 割り込みを処理します */
void DMAChn1ISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiMaster_isrDmaTransmit(&g_qspiDma.spiMaster);
send_ASCLIN_UART_message(0x1a);
Arry_send_ASCLIN_UART_message(SPI_BUFFER_SIZE,&g_qspiDma.qspiBuffer.spiMasterTxBuffer[0]);
}


/* DMA チャネル 2 割り込みを処理します */
void DMAChn2ISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiMaster_isrDmaReceive(&g_qspiDma.spiMaster);
send_ASCLIN_UART_message(0x2a);

}


/* DMA チャネル 3 割り込みを処理します */
void DMAChn3ISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiSlave_isrDmaTransmit(&g_qspiDma.spiSlave);
send_ASCLIN_UART_message(0x33);
}


/* DMA チャネル 4 割り込みを処理します */
void DMAChn4ISR(void)
{
IfxCpu_enableInterrupts();
IfxQspi_SpiSlave_isrDmaReceive(&g_qspiDma.spiSlave);
send_ASCLIN_UART_message(0x44);
Arry_send_ASCLIN_UART_message(SPI_BUFFER_SIZE,&g_qspiDma.qspiBuffer.spiSlaveRxBuffer[0]);
}

/* この関数は、QSPI2 をマスタ モードで初期化します */
スタティックボイド初期化QSPI2マスター(ボイド)
{
IfxQspi_SpiMaster_Config spiMasterConfig;/* マスター構成を定義します */

IfxQspi_SpiMaster_initModuleConfig(&spiMasterConfig, QSPI2_MASTER);/* デフォルト値で初期化します */

定数 IfxQspi_SpiMaster_Pins qspi2Masterpins = {
&IfxQspi2_SCLK_P15_3_OUT, IfxPort_OutputMode_pushPull, /* SCLK Pin (CLK) */
&IfxQspi2_MTSR_P15_5_OUT, IfxPort_OutputMode_pushPull, /* Master Transmit Slave Receive Pin (MOSI) */
&IfxQspi2_MRSTA_P15_4_IN, IfxPort_InputMode_pullDown, /* Master Receive Slave Transmit Pin (MISO) */
IfxPort_PadDriver_cmosAutomotiveSpeed3 /* Pad driver mode */
};
spiMasterConfig.pins = &qspi2Masterpins;/* マスターピンを割り当てる */

spiMasterConfig.dma.useDma = TRUE;
spiMasterConfig.dma.txDmaChannelId = IfxDma_ChannelId_1;
spiMasterConfig.dma.rxDmaChannelId = IfxDma_ChannelId_2;

spiMasterConfig.base.txPriority = ISR_PRIORITY_DMA_CH1;
spiMasterConfig.base.rxPriority = ISR_PRIORITY_DMA_CH2;
spiMasterConfig.base.erPriority = ISR_PRIORITY_QSPI2_ER;
spiMasterConfig.base.isrProvider = ISR_PROVIDER_QSPI2;

/* ユーザー コンフィギュレーションを使用して QSPI マスター モジュールを初期化します */
IfxQspi_SpiMaster_initModule(&g_qspiDma.spiMaster, &spiMasterConfig);
}

/* この関数は QSPI2 チャネルを初期化します。 */
static void initQSPI2MasterChannel(void)
{
IfxQspi_SpiMaster_ChannelConfig spiMasterChannelConfig;/* マスターチャネル設定を定義します */

IfxQspi_SpiMaster_initChannelConfig(&spiMasterChannelConfig, &g_qspiDma.spiMaster); /* デフォルト値で初期化します */

spiMasterChannelConfig.base.baudrate = MASTER_CHANNEL_BAUDRATE;/* SCLK 周波数を 1 MHz に設定します */

const IfxQspi_SpiMaster_Output qspi2SlaveSelectQspi3 = {
&IfxQspi2_SLSO0_P15_2_OUT, IfxPort_OutputMode_pushPull, /* Slave Select Pin (CS) */
IfxPort_PadDriver_cmosAutomotiveSpeed1 /* Pad driver mode */
};
spiMasterChannelConfig.sls.output = qspi2SlaveSelectQspi3;
spiMasterChannelConfig.mode=IfxQspi_SpiMaster_Mode_short;

 

/* ユーザー コンフィギュレーションを使用して QSPI マスター チャネルを初期化します */
IfxQspi_SpiMaster_initChannel(&g_qspiDma.spiMasterChannel, &spiMasterChannelConfig);
spiMasterChannelConfig.mode == IfxQspi_SpiMaster_Mode_longContinuous;

}

/* この関数はマスター SW バッファを初期化します */
static void initQSPI2MasterBuffers(void)
{
for (uint32 i = 0; i < SPI_BUFFER_SIZE; i++)
{
/* Fill the SPI Master TX Buffer */
g_qspiDma.qspiBuffer.spiMasterTxBuffer[i] = 0x55;//(uint8)(i + 1);
/* Clear the SPI Master RX Buffer */
g_qspiDma.qspiBuffer.spiMasterRxBuffer[i] = 0;
}
}
/* この関数はマスター SW バッファを初期化します */
スタティック ボイド クリアQSPI2マスター バッファ(ボイド)
{
for (uint32 i = 0; i < SPI_BUFFER_SIZE; i++)
{
/* SPI マスタ TX バッファを埋めます */

/* SPI マスタ RX バッファをクリアします */
g_qspiDma.qspiBuffer.spiMasterRxBuffer[i] = 0;
}
}
/* この関数は、QSPI3 をスレーブ モードで初期化します */
スタティックボイド初期化QSPI3スレーブ(ボイド)
{
IfxQspi_SpiSlave_Config spiSlaveConfig;/* スレーブ構成の定義 */

IfxQspi_SpiSlave_initModuleConfig(&spiSlaveConfig, QSPI3_SLAVE);/* デフォルト値で初期化します */

/* DMA モードを有効にします*/
spiSlaveConfig.dma.useDma = TRUE;
/* SPI スレーブ DMA チャネルを設定します */
spiSlaveConfig.dma.txDmaChannelId = IfxDma_ChannelId_3;
spiSlaveConfig.dma.rxDmaChannelId = IfxDma_ChannelId_4;

/* SPI スレーブ割り込みの設定 */
spiSlaveConfig.base.txPriority = ISR_PRIORITY_DMA_CH3;
spiSlaveConfig.base.rxPriority = ISR_PRIORITY_DMA_CH4;
spiSlaveConfig.base.erPriority = ISR_PRIORITY_QSPI2_ER;
spiSlaveConfig.base.isrProvider = ISR_PROVIDER_QSPI2;

定数 IfxQspi_SpiSlave_Pins qspi3Slavepins = {
&IfxQspi3_SCLKA_P02_7_IN, IfxPort_InputMode_pullDown, /* SCLK Pin (CLK) */
&IfxQspi3_MTSRA_P02_6_IN, IfxPort_InputMode_pullDown, /* Master Transmit Slave Receive Pin (MOSI) */
&IfxQspi3_MRST_P02_5_OUT, IfxPort_OutputMode_pushPull, /* Master Receive Slave Transmit Pin (MISO) */
&IfxQspi3_SLSIA_P02_4_IN, IfxPort_InputMode_pullDown, /* Slave Select Pin (CS) */
IfxPort_PadDriver_cmosAutomotiveSpeed3 /* Pad driver mode */
};

/* スレーブピンの割り当て */
spiSlaveConfig.pins = &qspi3Slavepins;

/* QSPI スレーブ モジュールを初期化します */
IfxQspi_SpiSlave_initModule(&g_qspiDma.spiSlave, &spiSlaveConfig);
}

/* スレーブ SW バッファを初期化します */
static void initQSPI3SlaveBuffers(void)
{
for (uint32 i = 0; i < SPI_BUFFER_SIZE; i++)
{
/* Fill the SPI Slave TX Buffer */
g_qspiDma.qspiBuffer.spiSlaveTxBuffer[i] = (uint8)(i + 0x64);
/* Clear the SPI Slave RX Buffer */
g_qspiDma.qspiBuffer.spiSlaveRxBuffer[i] = 0;
}
}

/* この関数は LED を初期化します */
スタティックボイド初期化LED(ボイド)
{
/* Set the port pin 13.3 (to which the LED D110 is connected) to output push-pull mode */
IfxPort_setPinModeOutput(LED_D110, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
IfxPort_setPinModeOutput(GPIOp220, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
/* Turn off the LED (LED is low-level active) */
// IfxPort_setPinLow(GPIOp220);
IfxPort_setPinHigh(LED_D110);
}

/* この関数は QSPI モジュールを初期化します */
静的ボイド初期化QSPI(ボイド)
{
/* まずスレーブを初期化します */
initQSPI3Slave();
initQSPI3SlaveBuffers();

/* 次にマスタを初期化します */
initQSPI2Master();
initQSPI2MasterChannel();
initQSPI2MasterBuffers();
}

/* この関数は、SPI と Cpu0_Main から呼び出される LED を初期化します */
void init周辺機器(void)
{
init_ASCLIN_UART();
initLED();
initQSPI();

}


/* この関数は、マスタとスレーブ間の QSPI 通信を保証し、
*データ転送が正しいかどうか
*/
ボイド転送データ(ボイド)
{

uint32 data=0x91929394 ;//=0x6762;
uint32 i;
uint32 エラー = 0;


IfxPort_setPinHigh(GPIOp220);
IfxQspi_SpiMaster_exchange(&g_qspiDma.spiMasterChannel, &g_qspiDma.qspiBuffer.spiMasterTxBuffer[0],
&g_qspiDma.qspiBuffer.spiMasterRxBuffer[0], SPI_BUFFER_SIZE);
waitTime(IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, 1000));/* 500 ミリ秒待機 */
//
while(IfxQspi_SpiMaster_getStatus(&g_qspiDma.spiMasterChannel) == SpiIf_Status_busy)
{
send_ASCLIN_UART_message(0x77);
}
Arry_send_ASCLIN_UART_message(SPI_BUFFER_SIZE,&g_qspiDma.qspiBuffer.spiMasterRxBuffer[0]);
IfxPort_setPinLow(GPIOp220);



/* エラーがない場合に LED D110 をオンにします (LED は低レベルがアクティブです) */
if(エラー == 0)
{
IfxPort_setPinLow(LED_D110);
}
}

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

请帮忙看一下,在没有连接Slave端时,测量Master端的clock 和data信号(图片如附件),如下是否正常?

 

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Bertxu 、

看起来黄色是Clock信号, 绿色是データ信号,感觉データ信号的电平有点怪怪的。

ブラジル、

ジェレミー

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

是在kit_tc397 的EVB上测试的,slave端不连接,使用的demo code,SPI demo code SPI的配置Master是使用是:

定数 IfxQspi_SpiMaster_Pins qspi2Masterpins = {
&IfxQspi2_SCLK_P15_3_OUT, IfxPort_OutputMode_pushPull, /* SCLK Pin (CLK) */
&IfxQspi2_MTSR_P15_5_OUT, IfxPort_OutputMode_pushPull, /* Master Transmit Slave Receive Pin (MOSI) */
&IfxQspi2_MRSTA_P15_4_IN, IfxPort_InputMode_pullDown, /* Master Receive Slave Transmit Pin (MISO) */
IfxPort_PadDriver_cmosAutomotiveSpeed3 /* Pad driver mode */
};

当我们使用例外一组SPI的配置Master ,测量出来得波形图看起来比较正常,波形图如附件:这可能是原因造成的呢?

定数 IfxQspi_SpiMaster_Pins qspi2Masterpins = {
&IfxQspi0_SCLK_P20_13_OUT, IfxPort_OutputMode_pushPull, /* SCLK Pin (CLK) */
&IfxQspi0_MTSR_P20_14_OUT, IfxPort_OutputMode_pushPull, /* Master Transmit Slave Receive Pin (MOSI) */
&IfxQspi0_MRSTA_P20_12_IN, IfxPort_InputMode_pullDown, /* Master Receive Slave Transmit Pin (MISO) */
IfxPort_PadDriver_cmosAutomotiveSpeed2 /* Pad driver mode */
};

 

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Bertxu

我觉得可能跟硬件有关,代码保持原样,同时将マスター和Slave各个引脚连接后,用示波器或者逻辑分析仪看一下MTSR脚的的的变化过程。

ブラジル、

ジェレミー

0 件の賞賛