This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:与外部 ADC 进行 SPI 通信时出现问题

Guru**** 1133960 points
Other Parts Discussed in Thread: ADS8686S, ADS8686SEVM-PDK, TMS320F28388D, SYSCONFIG, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1306714/tms320f28388d-problems-communicating-with-spi-with-an-external-adc

器件型号:TMS320F28388D
主题中讨论的其他器件:ADS8686SADS8686SEVM-PDKSysConfigC2000WARE

早上好、各位同事、

我不熟悉德州微控制器编程。 我正在使用 TMS320F28388D 的扩展坞对其进行编程。 我想通过 SPI 与 TI ADC 进行通信、特别是 ADS8686S 及其 ADS8686SEVM-PDK 评估板。
该 ADC 允许通过用于 ADCA 的双通道 SDOA 和用于 ADCB 的 SDOB 进行 SPI 通信、但我只想使用1个、因此阅读数据表、SDOB 接地和在 SDOA 中发送两次转换。
我的问题与 SPI 通信本身有关。 我编写了一个代码、基本上要使用这些代码执行一些非常基本的功能:
1.首先、写入 ADC 寄存器以按照我需要的方式对其进行配置(配置、输入电压范围、低通滤波器类型等)。
2.发送它来转换一个通道,让它给我返回转换。

此 ADC 利用 SPI 通信信号(PICO、POCI、SCLK、CS (GPIO 输出))、CONVST (GPIO 输出)、 BUSY (GPIO 输入)以及它们的使用根据 ADC 数据表时序图中显示的内容进行。 我在 SysConfig 的帮助下编写了一个代码(我仍然没有经验)、它会编译代码。 但是、当我连接两个器件并连接信号时、我看到它会卡在这个环路中。
我已经用示波器进行检查、微控制器的 SCLK 输出为0、它不会生成时钟脉冲。 我想知道您是否可以帮助我使用此代码。 基本上、阅读 ADC 数据表、我认为它的工作方式如下:

1.写入 ADC 寄存器:
-在50ns 的小周期内设置为1个转换。
随后,通过将 CS 设置为0来启用 SPI 通信。 清除
- SPI 帧与要配置的寄存器一起发送。
-等待接收一个中断标志进行接收。
-进入中断程序以接收来自 ADC 的消息并清除标志。
- CS 通过设置1停用。
2.读取 ADC 转换:
-在50ns 的小周期内设置为1个转换。
-如果设置为1、则 ADC 会将 BUSY 信号返回为1、直到转换完成。

当 BUSY 返回0时,即转换完成时,通过将 CS 设置为0来启用 SPI 通信。 清除
-等待接收中断标志。
进入中断程序接收 ADC 转换并清除标志。
-通过将 CS 设置为1来禁用 CS。 设置

我将给您留下我完成的代码和 SysConfig、以防您知道为什么时钟信号甚至没有随 ADC 发送、尽管在调试过程中它会滞留在中断标志的 while 部分。

#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "f2838x_device.h"
//#include "C:/ti/c2000/C2000Ware_5_00_00_00/device_support/f2838x/headers/include/f2838x_device.h"
//#include "F28x_Project.h"

//#include "F2838x_PieCtrl.h"
//
//
//

#ifdef __cplusplus
#pragma DATA_SECTION("SpiaRegsFile")
#else
#pragma DATA_SECTION(SpiaRegs,"SpiaRegsFile");
#endif
volatile struct SPI_REGS SpiaRegs;

#ifdef __cplusplus
#pragma DATA_SECTION("GpioDataRegsFile")
#else
#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");
#endif
volatile struct GPIO_DATA_REGS GpioDataRegs;



#ifdef __cplusplus
#pragma DATA_SECTION("PieVectTableFile")
#else
#pragma DATA_SECTION(PieVectTable,"PieVectTableFile");
#endif
volatile struct PIE_VECT_TABLE PieVectTable;

#ifdef __cplusplus
#pragma DATA_SECTION("DacaRegsFile")
#else
#pragma DATA_SECTION(DacaRegs,"DacaRegsFile");
#endif
volatile struct DAC_REGS DacaRegs;




volatile Uint16 lecturadatoADCdummy;
volatile Uint16 flag_conf_noconversion=1;
volatile Uint16 lecturaconvADCA;
volatile Uint16 lecturaconvADCB;

volatile Uint16 comandoADCconf;

Uint16 tramaConfADC=((1 << 15) | (0x2 << 9) | (0x0));     //MANDA TRAMA DE CONFIGURACIÓN DONDE SE DEJA A 0 MODO BURST, SEQEN, OSR, STATUSEN, CRCEN

Uint16 tramaRango_ADCA_0_3=((1 << 15) | (0x4 << 9) | (0x0)); //PONE EL RANGO DE ADC A DEL CANAL 0 AL 3 EN RANGO +-10V
Uint16 tramaRango_ADCA_4_7=((1 << 15) | (0x5 << 9) | (0x0)); //PONE EL RANGO DE ADC A DEL CANAL 4 AL 7 EN RANGO +-10V
Uint16 tramaRango_ADCB_0_3=((1 << 15) | (0x6 << 9) | (0x0)); //PONE EL RANGO DE ADC B DEL CANAL 0 AL 3 EN RANGO +-10V
Uint16 tramaRango_ADCB_4_7=((1 << 15) | (0x7 << 9) | (0x0)); //PONE EL RANGO DE ADC B DEL CANAL 4 AL 7 EN RANGO +-10V

Uint16 tramaFiltroPasoBajo=((1 << 15) | (0xD << 9) | (0x1)); //ESCRIBE FILTRO PASO BAJO DE FRECUENCIA DE CORTE 15kHz | ESCRIBIR 0x0 si se quiere de 39kHz o 0x2 si se quiere de 376kHz

Uint16 conv_ADCA_CH0=((1 << 15) | (0x3 << 9) | (0x0)); //TRAMA QUE ESCRIBE EN REGISTRO PARA ACTIVAR CONVERSIÓN DEL CANAL 0 en ADCA y ADCB. Si se quiere cambiar, ver mapa de registros

Uint16 conv_SEQ_STACK0=((1 << 15) | (0x20 << 9) | (0x0<<8) | (0x0)); //ESCRITURA DE STACK 0 CON SECUENCIA CHA0,CHB0 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK1=((1 << 15) | (0x21 << 9) | (0x0<<8) | (0x11)); //ESCRITURA DE STACK 1 CON SECUENCIA CHA1,CHB1 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK2=((1 << 15) | (0x22 << 9) | (0x0<<8) | (0x22)); //ESCRITURA DE STACK 2 CON SECUENCIA CHA2,CHB2 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK3=((1 << 15) | (0x23 << 9) | (0x0<<8) | (0x33)); //ESCRITURA DE STACK 3 CON SECUENCIA CHA3,CHB3 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK4=((1 << 15) | (0x24 << 9) | (0x0<<8) | (0x44)); //ESCRITURA DE STACK 4 CON SECUENCIA CHA4,CHB4 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK5=((1 << 15) | (0x25 << 9) | (0x0<<8) | (0x55)); //ESCRITURA DE STACK 5 CON SECUENCIA CHA5,CHB5 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK6=((1 << 15) | (0x26 << 9) | (0x0<<8) | (0x66)); //ESCRITURA DE STACK 6 CON SECUENCIA CHA6,CHB6 siguiendo al siguiente Stack
Uint16 conv_SEQ_STACK7=((1 << 15) | (0x26 << 9) | (0x1<<8) | (0x77)); //ESCRITURA DE STACK 7 CON SECUENCIA CHA7,CHB7 Volviendo al Stack 0 si burst mode. Si no, termina secuencia.


// SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, uint16_t txDelay);

// Main
//
volatile Uint16 DatoSPI;




interrupt void INT_SPIADC_EXT_CHAB_RX_ISR(void);
interrupt void INT_SPIADC_EXT_CHAB_TX_ISR(void);


void configuracionADC(void);
void lecturaconvADC(void);

void main(void)
{
    Uint16 comandoADC;


    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Disable pin locks and enable internal pull ups.
    //
    Device_initGPIO();

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();




    //
    // Disable sync(Freeze clock to PWM as well)
    //
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    //
    // Configure GPIO0/1 , GPIO2/3 and GPIO4/5 as ePWM1A/1B, ePWM2A/2B and
    // ePWM3A/3B pins respectively
    // Configure EPWM Modules
    //


    Board_init();
    SPI_enableHighSpeedMode(SPIADC_EXT_CHAB_BASE);


    // Enable sync and clock to PWM
    //
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    //
    // Enable ePWM interrupts
    //


    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // IDLE loop. Just sit and loop forever (optional):
    //

    PieVectTable.SPIA_RX_INT = &INT_SPIADC_EXT_CHAB_RX_ISR;
    PieVectTable.SPIA_TX_INT = &INT_SPIADC_EXT_CHAB_TX_ISR;
    /////////////////////////////////////////////REALIZAR CONFIGURACIÓN DEL ADC
    configuracionADC();
    ////////////

    //ESCRIBIR EN REGISTRO QUE SE QUIERE CONVERTIR CANAL 0 (TRAMA conv_ADCA_CH0) Y APLICAR SEÑAL DE CONVST


    lecturaconvADC();



    while(1){}


}

void configuracionADC(void){
   //ENVIAR CONFIGURACIÓN DE CONFIGURATION REGISTER 0x2

    GPIO_writePin(CONVST, 1);
     //Debe estar CONV high mínimo 50ns -VISTO EN OSCILOSCOPIO QUE HAY UN DELAY DE 480ns si se ponen seguidos los writepin de CONVST

  //  while (GPIO_readPin(BUSY)==1){} //Se espera a que se ponga a 0 BUSY

    GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
    GPIO_writePin(CONVST, 0);
    comandoADCconf=tramaConfADC;
    SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
    while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                //INTERRUPCIÓN DE RECEPCIÓN
    GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.

    //ENVIAR CONFIGURACIÓN DE RANGO DE CANALES 0-3 DE ADCA

    GPIO_writePin(CONVST, 1);
    GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
    GPIO_writePin(CONVST, 0);
    comandoADCconf=tramaRango_ADCA_0_3;
    SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
    while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                        //INTERRUPCIÓN DE RECEPCIÓN
    GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.

    //ENVIAR CONFIGURACIÓN DE RANGO DE CANALES 4-7 DE ADCA

        GPIO_writePin(CONVST, 1);
        GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
        GPIO_writePin(CONVST, 0);
        comandoADCconf=tramaRango_ADCA_4_7;
        SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
        while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                            //INTERRUPCIÓN DE RECEPCIÓN
        GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.
    //ENVIAR CONFIGURACIÓN DE RANGO DE CANALES 0-3 DE ADCB

        GPIO_writePin(CONVST, 1);
        GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
        GPIO_writePin(CONVST, 0);
        comandoADCconf=tramaRango_ADCB_0_3;
        SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
        while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                                //INTERRUPCIÓN DE RECEPCIÓN
        GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.

     //ENVIAR CONFIGURACIÓN DE RANGO DE CANALES 4-7 DE ADCA

        GPIO_writePin(CONVST, 1);
        GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
        GPIO_writePin(CONVST, 0);
        comandoADCconf=tramaRango_ADCB_4_7;
        SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
        while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                                        //INTERRUPCIÓN DE RECEPCIÓN
        GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.


    //ENVIAR CONFIGURACIÓN DE FILTRO PASO BAJO DE ENTRADA
        GPIO_writePin(CONVST, 1);
        GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.
        GPIO_writePin(CONVST, 0);
        comandoADCconf=tramaFiltroPasoBajo;
        SpiaRegs.SPITXBUF = comandoADCconf;            // Master transmite la configuración
        while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                                                       //INTERRUPCIÓN DE RECEPCIÓN
        GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.






         flag_conf_noconversion=0;




}


void lecturaconvADC(void){
    //ENVIAR CONFIGURACIÓN DE CONFIGURATION REGISTER 0x2

    GPIO_writePin(CONVST, 1); //uso de DEVICE_DELAY_US????
    GPIO_writePin(CONVST, 0);     //Debe estar CONV high mínimo 50ns -VISTO EN OSCILOSCOPIO QUE HAY UN DELAY DE 480ns si se ponen seguidos los writepin de CONVST
    while (GPIO_readPin(BUSY)==1){}

    GpioDataRegs.GPACLEAR.bit.GPIO23=1; //CS a 0 se activa.

    while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Espera hasta que envíe todos los bits de la trama.
                                                    //INTERRUPCIÓN DE RECEPCIÓN
    GpioDataRegs.GPASET.bit.GPIO23=1; //CS a 0 se desactiva.
}


interrupt void INT_SPIADC_EXT_CHAB_RX_ISR(void){
    if (flag_conf_noconversion==1){
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
        SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
       //  FlWaitADC_Ext=0;
        lecturadatoADCdummy = SpiaRegs.SPIRXBUF;     // Read data y resetea flag INT_FLAG

    }
    else{
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
        SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
               //  FlWaitADC_Ext=0;
        lecturaconvADCA = SpiaRegs.SPIRXBUF;     // Read data y resetea flag INT_FLAG
   //     DAC_setShadowValue(, lecturaconvADCA);
    }



 //   PieCtrlRegs.PIEACK.all |= PIEACK_GROUP6;       // Issue PIE ack
}
interrupt void INT_SPIADC_EXT_CHAB_TX_ISR(void){
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;  // Clear Interrupt flag
  //  PieCtrlRegs.PIEACK.all |= PIEACK_GROUP6;       // Issue PIE ACK
}

我也对高速模式有疑问、以及我可以从哪里在 SysConfig 中配置该选项、根据微控制器的数据表、您可以达到50MHz 速度、但我在 SysConfig 中看不到该选项。 我要做的是根据微控制器的数据表选择数据速度的 PICO、POCI、SCLK 的 GPIO 引脚、但不会应用"SPICCR.HS_MODE = 1"。 如果我选择一个12.5MHz 的比特率,程序运行到 while 循环,而如果我把它设置为50MHz ,我在 SPI_Init ()中得到一个错误。


因此、基本而言、我想指出以下几点: 是否有人可以帮助我创建一个可以在板上运行的代码以实现此相对简单的功能、为什么会出现这些错误、以及是否有人可以帮助我实施高速模式、无论是通过 SysConfig 还是 SysConfig 都可以实现 我想知道如何实现高速模式。

我也让您使用 SysConfig 操作系统工程的 zip 文件。 如果您能帮助我,我将不胜感激。 很抱歉可能有些愚蠢的问题。 提前感谢您。

Br、

佩德罗

e2e.ti.com/.../PRUEBA_5F00_SPI_5F00_ADC_5F00_F28388D.zip

在 SPI 中从 ADC 接收串行1线数据  

在 SPI 中串行寄存器写入 ADC  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pedro:

    很高兴 看到您对 TI 的 C2000 MCU 很陌生 、 没有一个很愚蠢的问题!  首先、我不熟悉  ADS8686S 或其评估板(如果您还没有深入了解、可能还想尝试接洽该产品线以获取进一步的见解)、但我当然可以尝试帮助阐明 F2838x 方面的某些方面。  

    几个初始问题、以便我更好地了解您的目标:

    • 看起来 F2838x 是控制器、 ADS8686S 将是外设、是否正确(如果正确、请知道 SPICLK 和芯片选择应由 F2838x 控制)?
    • 您是尝试使用 FIFO 还是非 FIFO 模式?
    • 您需要使用高速模式的特定原因是什么?
    • 当您单步执行代码时、您会陷入哪个"while"循环(有多个循环、因此我想知道具体是哪一个)? 如果控制器器件没有输出 SPICLK、这就是您卡在"while"循环中检查缓冲区状态的原因。 因此、首先我们需要让您的 SPICLK 运行。

    为了帮助阐明高速模式:您需要完成2项工作才能 使用 SPI 高速模式:

    1. 确保将 HS_MODE 位设置为"1" 要启用高速模式(这个位在 SPICCR 寄存器内)
      1. 最大高速率为 LSPCLK/4、因此对于 F2838x、使50MHz 成为最大 HS 频率
      2. 您将此混淆是完全 正确的、因为目前在 SysConfig 中没有指定的方式来设置高速模式(我们已注意到并将在将来纳入此模式)、  但您可以使用 driverlib 函数或 bitfield 来设置 HS_MODE (您仍然可以将 SysConfig 与此一起使用)。  
    2. 确保使用的 GPIO 支持高速模式 功能 (在 GPIO 模块中使用 GPxGMUX/GPxMUX 寄存器完成)。
      1.  有关 正确的多路复用器设置、请参阅 F2838x 数据表第6.5.5节"高速 SPI 引脚多路复用"(例如、您应该使用 GPIO58、GPIO59、GPIO60、GPIO61在 SPIA 上使用高速模式)

     同时还有其他一些一般指导:

    • 一个有用的提示(如果您是 SysConfig 新手、但还不知道)是、您可以通过点击箭头并打开"board.c"来查看在选择设置时生成的 c 代码:

    • 如果您有时间浏览 C2000 Academy、这里还有一些其他有用的视频/说明和资源链接。
    • 您是否看过我们在 C2000Ware 中提供的一些示例? 如果不是、您可能会发现浏览并尝试使用一些外部环回示例来熟悉 SPI 模块(位于目录{C2000Ware}\driverlib\f2838x\examples\C28x\SPI 中)会很有帮助。  

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    早上好 Allison、

    非常感谢您的回复! 我很抱歉现在读到它,但我是在圣诞节假期。 关于您提出的最初问题:

    • 看起来 F2838x 是控制器、 ADS8686S 将是外设、是否正确(如果正确、请知道 SPICLK 和芯片选择应由 F2838x 控制)? ->  F2838D 是控制器 SPI、ADS8686S 是外设 SPI
    • 您是尝试使用 FIFO 还是非 FIFO 模式? ->  非 FIFO 模式  
    • 您需要使用高速模式的原因是什么?->  我需要使用高速模式、因为我们要尽快获取 ADC 的数据。  
    • 当您单步执行代码时、您会陷入哪个"while"循环(有多个循环、因此我想知道具体是哪一个)? 如果控制器器件没有输出 SPICLK、这就是您卡在"while"循环中检查缓冲区状态的原因。 因此、首先我们需要让您的 SPICLK 运行->  我遇到的 while 循环是其中第一个循环。 在 第184行的第一个循环中的函数 configuracionadc ()中。 我首先需要的是运行 SPICLK、然后是数据传输、但我不知道为什么甚至 不传输 SPICLK。

    关于高速模式、我将 HS_MODE 位设置为1并使用用于高速模式的 GPIO 引脚、我在配置中已经考虑到了这一点。  我发现看到 SysConfig 中生成的代码的提示非常有趣。 关于 C2000 Academy 和 C200Ware 示例、我做了这些、我理解了它们。 非常感谢您的时间 Allison,我希望您能够查看您问我的问题的答案。
    祝您度过美好的一天!

    佩德罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pedro:

    感谢您的回答和提供的信息! 很高兴你也能够使用 C2000 Academy 和 C2000Ware 示例。  

    如果您尝试使用高速模式、则只能在指定的 HS SPI 功能引脚上使用。 您似乎正在使用 GPIO23作为代码中的手动控制芯片选择引脚 、是否有理由不使用默认的 SPISTE 引脚并使其自动通过通信进行切换?  两个器件之间的所有外部连接都是什么(就像需要仔细检查的另一项一样)?

    因为我不熟悉 ADS8686系列的器件要求、 但仔细研究一下、当 CONVST 被拉高时、忙线应该会变为高电平以启动转换-即使没有看到 SPICLK、您是否看到了这种情况发生? CS 和 SPICLK 活动应在这些变为高电平后出现。

    此外、如 TRM 中所述、在非 FIFO 模式下没有 TX 中断、但我可以看到您的代码中指定了它-您是否考虑使用 FIFO 模式并实现 TX 中断?

    此致、

    艾里森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Allison:  

    感谢您的快速回答。 不可以、我之所以选择 GPIO 作为 CS、而不是 STE 引脚、没有原因、或许最好的选择不是选择 GPIO、以进入 HS 模式。 现在、我将让这个问题暂挂、因为我们正尝试与 ADC 的并行总线通信、以便它能够达到更高的传输速度。

    万一出现这种情况、我会向您介绍 SPI 解决方案。 非常感谢您的观看、祝您周末愉快。

    Br、

    佩德罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pedro:

    感谢您的回复。 请告诉我您是否能够取得任何进展。 另一个建议是通过 尝试在启用内部环回模式(在内部将 PICO 连接到 POCI)的情况下测试/调试您的程序或通过外部环回(使用一根导线连接 PICO 和 POCI (都没有连接到外部外设器件 ADS8686)来简化系统    独立于 ADS8686器件、查看您的设置是否正确。  成功循环后、您会 尝试与另一个器件通信。

    此致、

    艾里森