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.

[参考译文] CCS/ADS8699:ADS8699 SPI DMA 示例代码

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/753727/ccs-ads8699-ads8699-spi-dma-example-c-code

器件型号:ADS8699
主题中讨论的其他器件: MSP432P401R

工具/软件:Code Composer Studio

您好!

我尝试从 ADS8699中获取采样值、但不太清楚如何在 c 代码中实现这一点。 我看到了像 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/421491这样的代码

我还阅读了《MSP432Registered外设驱动程序库用户指南》中的数据表和 SPI 部分。 有很多细节需要了解...

如果有一个示例说明如何从 ADC 读取原始值、那将不胜感激。 最后、我想通过 DMA 获取8192个样本。

我希望有一些例子、或者您可以为我提供一些帮助。

我的设置:ADS8699、msp432P401R、CCS 版本:8.2.0.00007

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

    遗憾的是、我们没有任何与 MSP430P401R 共享 ADS8699的示例代码。 但是、我看到您在 MSP430论坛上提出了类似的问题、似乎您在某个点上有一些有效的代码(e2e.ti.com/.../753655)。 您是否可以发布现有 SPI 控制线(SCLK、SDI、SDO 和 CONVST/CS)的屏幕截图? 也许我们可以通过这种方式看到问题是什么。 您上面提到的代码具有高电平有效芯片选择、ADS8699将需要低电平有效芯片选择、如数据表的图3所示。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的写作。 CS 处于低 I 识别状态。 我将其接线、正如您在代码中看到的那样。 首先、我想直接使用 SPI 进行测试、然后使用带有 DMA 的 SPI 进行测试、因为它更复杂。

    从示例中、我将时钟和 EUSCI_B0_MODEL 更改为 EUSCI_B0_BASE、因为...我会说...模块 I 未声明为 msp432。

    它如下所示:

    /* MSP432 = SPI 主器件、 外部器件= SPI 从器件
    *
    MSP432P401 ADS8699
    * -------- --------
    * | | | |
    * | 5V |-> ->| DVDD |
    * | | | |
    * | GND |-> ->| DGND |
    * | | | |
    | P4.3 |->_CS ->| CST/CS |
    * | | | |
    * | P1.6 |->数据输出(UCB0SIMO) ->| SDI |
    * | | | |
    * | P1.7 |<-数据输入(UCB0SOMI) <-| SDO0 |
    * | | | |
    * | P1.5 |->串行时钟输出(UCB0CLK) ->| SCLK |
    (小部分 /#include
    
    
    #include 
    #include 
    #include 
    
    静态易失性 uint8_t RXData[10];
    静态易失性 uint8_t i = 0;
    静态 uint8_t TXData = 0;
    静态 uint8_t ii = 0;
    
    
    // SPI 主配置参数*
    / const eUSCI_SPI_MasterConfig stiMasterConfig =
    {
    EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    3000000、 // SMCLK = DCO = 3MHz
    50万、 // SPICLK = 500kHz
    EUSCI_B_SPI_MSB_FIRST、 // MSB 优先
    EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_Captured_On_Next、//相位
    EUSCI_B_SPI_CLOCKPOLARITY_INACTION_LOW、//低极性
    EUSCI_B_SPI_3引脚 // 3线 SPI 模式
    };
    
    
    int main (void)
    {
    volatile uint32_t ii;
    
    /*停止 WDT */
    WDT_A_HOLDTimer();
    
    /*启动和启用 LFXT (3MHz)*/
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_Function);
    cs_setExternalClockSourceFrequency (3000000、0);
    CS_initClockSignal (CS_SMCLK、CS_LFXTCLK_select、CS_Clock_divider);
    CS_startLFXT (CS_LFXT_Drive0);
    
    
    /*选择 P1.0作为 LED */
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
    GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
    
    
    /* SPI --> P4.3 =_CS、P1.5 = CLK、P1.6 = MOSI & P1.7 = MISO */
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);
    GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN3);
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    
    
    /*在3线主控模式下配置 SPI 并启用它和中断*/
    SPI_initMaster (EUSCI_B0_BASE、&spiMasterConfig);
    SPI_enableModule (USCI_B0_BASE);
    SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);
    INTERRUPT_enableInterrupt (INT_EUSCIB0);
    //Interrupt_enableSlepOnIsrExit();
    /*延迟等待模块初始化*/
    for (ii = 0;ii < 100;ii +);
    
    
    /* SPI、将_CS 置于低电平 P4.3并轮询以查看 TX 缓冲区是否就绪或繁忙*/
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    
    
    // TXData = 0x40;
    // while (!(SPI_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit_interrupt));
    // SPI_transmitData (EUSCI_BASE、TXSCI_Transmit)
    ;// TXSCI_Transmit Data (TXSCI_BIST/ TX0_BASE
    );//(TXSCI_Transmit);// TXSCI_Transmit_INTERData (TXSCI_Transmit);//(TXSCI_0_INTERRUPTICT_SPI_0_BASE);//(TXSCI_Transmit)
    
    
    
    while (1){}
    /*PCM_gotoLPM0();
    __no_operation();*/
    }
    
    
    void euscib0_isr (void)
    {
    int i = 0;
    uint32_t status = SPI_getEnabledInterruptStatus (EUSCI_B0_BASE);
    SPI_clearInterruptFlag (EUSCI_B0_BASE、STATUS);
    
    IF (STATUS 和 EUSCI_B_SPI_Receive_interrupt)
    {
    RXData[i++]= SPI_receiveData (EUSCI_B0_BASE);
    如果((I % 2)= 1){
    for (ii = 0;ii < 10;ii +);
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    }
    GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    for (i=0;i<48000000;i++);//延迟1
    GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    }
    

    软件始终处于 while (1)、未输入函数 euscib0_isr ()。 我认为在_CS 处于低电平时、ADC 开始工作并发送中断。

    但是、这是如何"发送中断"到 msp432的?

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

    您好!

    我希望您能与我们分享屏幕截图。 ADS8699使用其 CONVST/CS 引脚作为开始转换过程的机制。 您需要将该引脚切换为高电平、从而启动转换并将 RVS 引脚驱动为低电平。 一旦 RVS 引脚切换回高电平状态、您将需要再次发送 CONVST/CS 低电平、以开始驱动 SCLK 引脚、从而从 ADC 检索转换结果。 请看第11页的图1和图3、RVS 引脚基本上用作处理器的中断。

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

    您好!

    在 c 代码中、您可以看到新的引脚配置。 我使用 RVS 信号对其进行了扩展。

    1.我想使用最大值 16MHz 的 SPI 速度。 我不确定常数:

    /* SPI 主配置参数*/
    const eUSCI_SPI_MasterConfig spiMasterConfig =
    {
    EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    3000000、 //时钟源频率:SMCLK = DCO = 3MHz
    16000000、 //需要的 SpiClock:SPICLK = 16MHz
    EUSCI_B_SPI_MSB_FIRST、
    
    // MSB 优先
    EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_Captured_On_Next、//相位
    EUSCI_B_SPI_CLOCKPOLARITY_INACTION_LOW、//低极性
    EUSCI_B_SPI_3引脚 // 3线 SPI 模式
    }; 

    哪个/哪个时钟提供时钟源频率? 我只能选择 SMCLK 和 ACLK。

    此外、 在 while 环路(下面 se)运行时、我无法使用示波器识别引脚1.5处的时钟。 因此、我认为时钟设置有问题。

    2.参见第11页图 1和3我制作了一个简单的测试序列:

    while (1){
    //转换从 CONV 的上升沿开始:
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    GPIO_setOutputHighOnPin (GPIO_PORT_P4、GPIO_PIN3);
    //等待转换完成(RVS ->高电平):
    while (GPIO_getInputPinValue (GPIO_PORT_P4、GPIO_PIN6)=0);
    //将读取缓冲器的 CONV 设置为低电平:
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    int k;
    对于(k = 0;k < 4;+k){
    RXData[k]= SPI_receiveData (EUSCI_B0_BASE);
    }
    }
    

    但每次我使用 SPI_receiveData 0x0000311C 进行读取。 值不会改变。 出什么问题了?

    此致

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

    (笑声) 抱歉、我忘记了引脚配置:

    /*
    整个电路、如数据表中的图67和98
    *
    * MSP432 = SPI 主器件、 外部器件= SPI 从器件
    *
    MSP432P4111 ADS8699
    * -------- --------
    * | | | |
    * | 5V |-> ->| DVDD |
    * | | | |
    * | GND |-> ->| DGND |
    * | | | |
    | P4.3 |->_CS ->| CST/CS |
    * | | | |
    * | P4.6 |<-转换 就绪 <-| RVS |
    * | | | |
    * | P1.6 |->数据输出(UCB0SIMO) ->| SDI |
    * | | | |
    * | P1.7 |<-数据输入(UCB0SOMI) <-| SDO0 |
    * | | | |
    * | P1.5 |->串行时钟输出(UCB0CLK) ->| SCLK |
    */ 

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

    您能否发送示波器屏幕截图? 通常情况下、SPI 主器件发送时钟、这意味着您必须启动发送才能从器件获取 SDO。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    问题是、我没有时钟!

    /* SPI 主配置参数*/
    const eUSCI_SPI_MasterConfig spiMasterConfig =
    {
    EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    48000000、 // SMCLK = DCO = 3MHz
    16000000、 // SPICLK = 500kHz
    EUSCI_B_SPI_MSB_FIRST、
    // MSB 优先
    EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_Captured_On_Next、//相位
    EUSCI_B_SPI_CLOCKPOLARITY_INACTION_LOW、//低极性
    EUSCI_B_SPI_3引脚 // 3线 SPI 模式
    };
    
    int main (void)
    {
    /*停止 WDT */
    WDT_A_HOLDTimer();
    
    /*启动并启用 HFXT */
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);
    
    cs_setExternalClockSourceFrequency (32000、48000000);
    
    /*在非旁路模式下启动 HFXT 而不超时。 开始之前
    *我们必须将 VCORE 更改为1以支持48MHz 频率*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);
    MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
    CS_startHFXT (false);
    
    /*在非旁路模式下启动 HFXT 而不超时。 开始之前
    *我们必须将 VCORE 更改为1以支持48MHz 频率*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);
    MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
    CS_startHFXT (false);
    
    //![简单 SPI 示例]
    /*在 SPI 模式下选择 P1.5 P1.6和 P1.7 */
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION); 

    我需要16MHz 的 SPI 时钟。 我尝试使用48MHz HFXT 和 SMCLK 来创建它。 您能看到问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您必须通过向 SPI 端口"写入"来启动数据传输-这意味着主器件(您的 MSP432P4111)必须将数据(通常仅为零)移动到发送缓冲器。 否则、您将无法获得时钟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果我发送"SPI_transmitData (EUSCI_B0_BASE、0x00);"、那么时钟是否启动?
    我想当我在 CONV P4.3上创建一个上升沿时、转换开始。 RVS 达到高电平后、转换完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当使用内部时钟进行转换时、是-脉冲 CONV 负责实际的转换过程。 您仍然需要从主机控制器生成 SCLK 以读取转换结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    发送"SPI_transmitData (EUSCI_B0_BASE、0x00);"后
    以下 GPIO 读取或写入命令始终在默认处理程序中结束...?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定您的意思、但您必须发送足够多的字节才能从器件读取完整的转换结果、您应该将转换数据放入接收缓冲区、然后再将其连接到完整的转换结果中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的意思是、在我向 ADS8699发送0x00后、我必须将 CONV 设置为高电平、因为 ADS8699需要这个高电平才能开始转换。 此时、当我将 GPIO 引脚 P4.3从低电平设置为高电平时、CCS 的调试器会进入默认处理程序。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、您要向 ADS8699获取 SCLK 吗? 读出所有数据后、您可以再次将 CONV 重置为高电平以开始下一次转换。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 P1.5上、我无法识别时钟。

    如果我有一个用于 ADS8699和 MSP432P4111的代码示例来读取数字值、我会很高兴。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我们没有示例可供您查看。 您是否有任何方法可以向 ADC 显示示波器迹线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    遗憾的是、目前我无法显示示波器轨迹。 如果我理解严格、那么我需要从 msp432到 ADC 的时钟仅用于读取和写入、ADC 按内部时钟运行。 如果我在 CONV 发送高电平、则转换开始、在 RVS 下一个高电平、我可以读取 SPI 缓冲器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的-没错。 如果您无法监控 ADC 和微控制器之间的信号、则很难进行下一步操作。 即使我知道要向您发送工作代码、这也取决于硬件、您仍然需要一个 O'Scope 或逻辑分析仪来验证所有操作是否正常。 让我们知道您何时能够监控 SPI 总线、我们将从那里取回它。 同时,我祝您的假日季快乐!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、希望大家过得愉快。

    现在、我有一个用于监控信号的 O'Scope。 此外、我还编写了具有不同时钟源的新示例代码、以查找有效时钟源:

    1、外部时钟48MHz:可能由于分频器的固定分频器大于12MHz、我的目标 SPI 时钟16MHz 是不可能的

    2.内部时钟:设置为32MHz、以便我使用分频器2到达16MHz

    3、内部时钟速度慢:正如我在用户指南示例中看到的

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    静态易失性 uint8_t RXData[10];
    静态易失性 uint8_t i = 0;
    静态 uint8_t TXData = 0;
    静态 uint8_t ii = 0;
    
    // SPI 主配置参数*
    / const eUSCI_SPI_MasterConfig stiMasterConfig =
    {
    //=========== 外部时钟========================
    // EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    // 24000000、 // SMCLK
    // 12000000、 // SPICLK
    // EUSCI_B_SPI_MSB_FIRST、
    //=========== 内部时钟===================
    // EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    // 32000000、 // SMCLK
    // 16000000、 // SPICLK
    // EUSCI_B_SPI_MSB_FIRST、
    //=========== 内部时钟示例 SLOW ===
    EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    3000000、 // SMCLK
    50万、 // SPICLK
    EUSCI_B_SPI_MSB_FIRST、
    //========================================================================================
    
    // MSB 优先
    EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_Captured_On_Next、//相位
    EUSCI_B_SPI_CLOCKPOLARITY_INACTION_LOW、//低极性
    EUSCI_B_SPI_3引脚 // 3线 SPI 模式
    };
    
    
    int main (void)
    {
    volatile uint32_t ii;
    
    /*停止 WDT */
    WDT_A_HOLDTimer();
    
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);// Achtung zwingend vor clock set、sonst factory reset nötig
    MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);
    MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
    
    /*=========== 外部时钟======================================================================================== *
    
    //
    启动并启用 HFXT *// GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);
    
    // CS_setExternalClockSourceFrequency (32000、48000000);
    /////////*
    -------------------------- initClockSignal 的 POS.1 ------ //
    map_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_clock_divider);//48MHz
    // map_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider 4); ///12MHz
    ///*---------------------------------------------------- //
    
    ////////////////////*在非旁路模式中启动 HFXT 而不超时。 开始之前
    // *我们必须将 VCORE 更改为1以支持48MHz 频率*//
    
    CS_startHFXT (false);
    
    ///*------------ initClockSignal 的 POS.2 ------ ////*
    -------------------------------------------------------- */
    
    /*====== 内部时钟=========================================================================== //
    CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY);//48MHz
    // CS_setDCOFrequency (32000000);
    // CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider);
    
    /*=========== 内部时钟示例 SLOW ================================================================================================ *
    CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY);//48MHz
    CS_setDCOFrequency (3000000);
    CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider _1);
    //================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    //![简单 SPI 示例]
    /*在 SPI 模式下选择 P1.5 P1.6和 P1.7 */
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);
    
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);// P1.0 LED
    GPIO_setAsInputPin (GPIO_PORT_P4、GPIO_PIN6);// P4.6 RVS
    GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN3);// P4.3 CONV
    
    GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);// P1.0 LED
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);// P4.3 CONV
    
    /*在3线主控模式下配置 SPI 并启用它和中断*/
    bool STATUSFLAG = false;
    STATUSFLAG = SPI_initMaster (EUSCI_B0_BASE、&spiMasterConfig);
    SPI_enableModule (USCI_B0_BASE);
    SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);
    INTERRUPT_enableInterrupt (INT_EUSCIB0);
    //Interrupt_enableSlepOnIsrExit();
    /*延迟等待模块初始化*/
    for (ii = 0;ii < 100;ii +);
    
    /* SPI、将_CS 置于低电平 P4.3并轮询以查看 TX 缓冲区是否就绪或繁忙*/
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    
    SPI_transmitData (EUSCI_B0_BASE、0xFF);
    
    while (1){
    
    /*------------------------------------------------------------------------ SMCLK 高斯伦和 mit printf ausgeben? -------------------------------------- //
    int clock = CS_getSMCLK ();
    /*------------------------------------------ *
    
    GPIO_getInputPinValue (GPIO_PORT_P4、GPIO_PIN6);// RVS 应为高电平
    //转换从 CONV 上的上升沿开始:
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    GPIO_setOutputHighOnPin (GPIO_PORT_P4、GPIO_PIN3);
    
    //printf ("等待转换完成(RVS ->高电平)");
    while (GPIO_getInputPinValue (GPIO_PORT_P4、GPIO_PIN6)=0);// RVS
    //将读取缓冲器的 CONV 设置为低电平:
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    int k;
    对于(k = 0;k < 4;+k){
    RXData[k]= SPI_receiveData (EUSCI_B0_BASE);
    }
    __no_operation();
    }
    /*PCM_gotoLPM0();
    __NO_OPERATION ();*/
    }
    
    
    //void euscib0_ISR (void)
    //{
    // int i = 0;
    // uint32_t status = spi_getEnabableInterruptStatus (eUSCI_B0_BASE);
    // spi_clearInterruptFlag (eUSCI_B0_BASE、STATUS);
    //
    /spi_receive_/中断//////////uSPI
    
    RXData[i++]= SPI_receiveData (EUSCI_B0_BASE);
    // 如果((I % 2)= 1){
    // for (ii = 0;ii < 10;ii +);
    // GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);
    //}
    // GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    // for (i=0;i<48000000;i++);//延迟1s
    // GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    //}
    //}
    

    我在调试时遇到的第一个问题是、当我在 for 循环后输入"GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN3);"行时、我总是在默认处理程序中结束。

    /*这是当处理器收到意外的*/
    /*中断时调用的代码。 这只是进入一个无限循环、保持系统状态*/
    //*供调试器检查。 */
    void Default_Handler (void)
    {
    /* ULP Advisor 可免除故障陷阱*/
    #pragma diag_push
    #pragma CHECK_ULP ("-2.1")
    
    /*输入无限循环。 //
    while (1)
    {
    }
    
    #pragma diag_pop
    } 

    如果我执行"单步执行 F5"步骤、我不会在处理程序中结束、但使用"单步执行 F6"步骤、我将在默认处理程序中结束。

    我找不到这方面的解释。

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

     如果我使用"内部时钟慢速(500kHz)"变量运行评估板、并且没有调试器、那么我可以在按下复位按钮一次后触发时钟。

    1ch=clk

    2.ch=CONV

    3.ch=RVS

    4.ch=SOMI

    时钟可能来自"SPI_transmitData (EUSCI_B0_BASE、0xFF);"传输。 但没有 CONV 或 RVS 高电平。

    使用 SIMO 和 SOMI:

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

    我看到您写入 SPI_transmitData (EUSCI_B0_BASE、0xFF);恰好在'while (1)'循环之前。 SPI_transmitData 导致 SCLK 运行并发送从 SIMO 绿线迹中看到的0xFF、ADS8699在 SOMI 处响应0x1D、并且很可能在进入 while (1)循环之前触发 RX 中断。

    在您的 euscib0_ISR 循环中、您似乎在等待数据被接收、但我在这里看不到生成时钟的方法。 如果您希望读取4个字节、则必须生成32个 SCLK、以便将数据(例如0x00)放入发送缓冲区。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、新年快乐!

    void euscib0_ISR (void)当前已禁用、但我已启用中断、可能我也应该禁用中断。

    您是不是说我必须发送

    SPI_transmitData (EUSCI_B0_BASE、0xFFFFFFFF);或 SPI_transmitData (EUSCI_B0_BASE、0x00000000);

    在 RXData[k]= SPI_receiveData (EUSCI_B0_BASE)之前读取4个字节;?

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

    现在、我想我可以读取 ADC 值。
    默认处理程序的问题是、我启用了中断、但 ISR 函数被禁用。

    要验证数字 ADC 值、我应该知道"ADC 输入范围"的设置是什么。
    如果我在输出寄存器读取32位、则位0至13始终为0。这可能是因为"range_incl"标志未设置为1。
    如何将此标志设置为1以读出"ADC 输入范围"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、user5841294、

    加电 ADC 后、DATAOUT_CTL_REG 寄存器中的所有位都为零、SDO-x 上的32位输出数据将仅包含18位转换 结果、其余位将全部为零、因此您可以获得有关 SDO-x 的正确信息  默认范围 为0000b、这意味着+/-3VREF 输入范围(+/-12.288V)、请参阅数据表表表15中有关 DATAOUT_CTL_REG 寄存器的信息。

    要设置 DATAOUT_CTL_REG 寄存器中的"Range_相容"位、可以使用以下命令之一:

    写入命令

    11010_01_<0_0001_0000><00000001_00000000> 或

    11010_00_<0_0001_0000><00000001_00000000>  

    SET_HWORD 命令

    11011_00_<0_0001_0000><00000001_00000000>  

    格式备注:   COMMAND_  

    请参阅 ADS8699数据表的表5中的命令详细信息和表15中的寄存器详细信息。

    如果您有任何疑问、请告知我们。

    此致

    戴尔

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

    您好 Dale、

    好极了。 对于启动、我可以将 DATAOUT_CTL_REG 值设置为与表6相同。 在数据表中、具有:

    #define WRITE                 0xD000
    #define DATAOUT_CTL_REG 0x10

    ADC_Command =写入+ DATAOUT_CTL_REG;
    SPI1_ADC_TxBuffer[0]=(uint8_t)(ADC_Command >> 8);
    SPI1_ADC_TxBuffer[1]=(uint8_t) ADC_Command;
    SPI1_ADC_TxBuffer[2]= 0x55;
    SPI1_ADC_TxBuffer[3]= 0x08;
    
    SPI_transmitData (EUSCI_B0_BASE、SPI1_ADC_TxBuffer[0]);
    SPI_transmitData (EUSCI_B0_BASE、SPI1_ADC_TxBuffer[1]);
    SPI_transmitData (EUSCI_B0_BASE、SPI1_ADC_TxBuffer[2]);
    SPI_transmitData (EUSCI_B0_BASE、SPI1_ADC_TxBuffer[3]);
    
    _DELAY_CYCLES (4800000); 

    它看起来很好。

    但是:
    1.我读出的18位值与范围(0011=1.25*Vref)不匹配:

    我的32位读出器的一些 printf (第二个数字是当前的18位 ADC 值):

    Mean=158096 158096 1001101001100100000000000000000000001100
    Mean=158100 158105 1001101001100100000000001100
    平均值=158100 10011010011001010000000000000000
    平均值=158101 158103 10011010011001011100000000000000
    平均值=158101 158102 10011010011001011000000000001100
    平均值=158104 158108 10011010011001110000000000001100
    平均值=158106 158109 10011010011001110100000000000000
    平均值=158106 158106 10011010011001101000000000001100
    平均值=158108 158110 10011010011001111000000000000000
    平均值=158106 158105 1001101001100100000000001100
    平均值=158104 158102 10011010011001011000000000001100
    平均值=158104 158104 100110100110011000000000000000000
    平均值=158104 158104 100110100110011000000000000000000
    平均值=158102 158101 100110100110010100000000001100
    平均值=158106 158111 100110100110011100000000001100
    平均值=158108 158111 100110100110011100000000001100
    平均值=158105 158103 10011010011001011100000000000000
    平均值=158105 158105 1001101001100100000000001100
    平均值=158104 158104 100110100110011000000000000000000
    平均值=158104 158105 1001101001100100000000001100
    平均值=158103 158103 10011010011001011100000000000000
    平均值=158105 158108 10011010011001110000000000001100
    平均值=158106 158108 10011010011001110000000000001100
    平均值=158103 158101 100110100110010100000000001100
    平均值=158103 158103 10011010011001011100000000000000
    平均值=158104 158106 10011010011001101000000000001100
    平均值=158103 158102 10011010011001011000000000001100
    平均值=158105 158107 1001101001100110110000000000
    平均值=158105 158105 1001101001100100000000001100
    平均值=158106 158107 1001101001100110110000000000
    平均值=158107 158108 10011010011001110000000000001100
    平均值=158100 158094 10011010011000111000000000001100

    我的测量和计算:

    AVDD 5、063
    AIN 2 555人
    ADC 值 158105. 数字
    ADC 值 60、3. 范围的%
    VOLTGE_calc 4 236人

    但是在设置1.25*Vref=5.12V 的情况下,我应该在185105位数处有 Voltage_calc=3.088V!?


    2.有时我读取的范围= 0000b?