TI论坛
直播中

贾虎世

7年用户 1704经验值
私信 关注
[问答]

想用C2000控制ADS8355采样,却采不了,为什么?


  • 想用C2000控制ADS8355采样,却采不了,能帮忙看一下程序哪里有问题嘛
    #include
    #include "driverlib.h"
    #include "device.h"
    //
    // Defines
    //
    #define EPWM1_tiMER_TBPRD 2000U//设置周期位2000个时钟周期
    #define EPWM1_CMPA 1000U//比较器的值为1000
    volatile uint16_t sData,i;//发送的数据 // Send data buffer
    volatile uint16_t r1Data[80];
    volatile uint16_t r2Data[80];
    //
    // Function Prototypes
    //
    void initEPWM1(void);
    __interrupt void SPIISR(void);
    void configGPIOs(void);
    void initSPIAMaster(void);
    //
    // Main
    //
    void main(void)
    {
    //
    // 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();
    //
    // Assign the interrupt service routines to ePWM interrupts
    //
    Interrupt_register(INT_EPWM1, &SPIISR);
    configGPIOs();
    //
    // Configure GPIO0/1 , GPIO2/3 and GPIO4/5 as ePWM1A/1B, ePWM2A/2B and
    // ePWM3A/3B pins respectively
    //
    Board_init();
    //
    // Disable sync(Freeze clock to PWM as well)
    //
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    initEPWM1();

    //
    // Enable sync and clock to PWM
    //
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    //
    // Enable ePWM interrupts
    //
    Interrupt_enable(INT_EPWM1);
    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00010400);//默认值
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00010500);//默认值
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00010D00);//默认值
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00011100);//默认值
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00012000);//默认值
    SPI_writeDataNonBlocking(SPIA_BASE, 0x000124FF);
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00012501);//设置满量程
    SPI_writeDataNonBlocking(SPIA_BASE, 0x000126FF);
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00012701);
    SPI_writeDataNonBlocking(SPIA_BASE, 0x00012800);//设置测量范围
    //
    // IDLE loop. Just sit and loop forever (optional):
    //
    for(;;)
    {
    NOP;
    }
    }
    void initSPIAMaster(void)
    {
    //
    // Must put SPI into reset before configuring it
    //
    SPI_disableModule(SPIA_BASE);
    //
    // SPI configuration. Use a 500kHz SPICLK (可以达到50MHZ)and 16-bit word size.
    //
    SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
    SPI_MODE_MASTER, 500000, 16);//DEVICE_LSPCLK_FREQ 代表50MHZ,SPI_PROT_POL0PHA0调的四种模式
    SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);//设置当暂停的时候,数据还怎么传输
    SPI_disableLoopback(SPIA_BASE);//跟实际通讯设备需要禁用
    //
    // FIFO and interrupt configuration
    //
    SPI_enableFIFO(SPIB_BASE);
    //
    // Configuration complete. Enable the module.
    //
    SPI_enableModule(SPIB_BASE);
    SPI_enableFIFO(SPIA_BASE);//使能FIFO 口
    SPI_enableModule(SPIA_BASE);//使能SPI功能
    //
    //
    }
    //
    // epwm1ISR - ePWM 1 ISR
    //
    __interrupt void SPIISR(void)
    {
    //
    // Update the CMPA and CMPB values
    //
    r1Data[i++] = SPI_readDataNonBlocking(SPIA_BASE);//第一个口收取数据
    r2Data[i++] = SPI_readDataNonBlocking(SPIA_BASE);//第二个口收取数据
    //
    // Clear INT flag for this timer
    //
    EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);//必须要
    //
    // Acknowledge interrupt group
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);//必须要
    }

    //
    // initEPWM1 - Configure ePWM1
    //
    void initEPWM1()
    {
    //
    // Set-up TBCLK
    //
    EPWM_setTimeBasePeriod(myEPWM1_BASE, EPWM1_TIMER_TBPRD);
    EPWM_setPhaseShift(myEPWM1_BASE, 0U);
    EPWM_setTimeBaseCounter(myEPWM1_BASE, 0U);
    //
    // Set Compare values
    //
    EPWM_setCounterCompareValue(myEPWM1_BASE,
    EPWM_COUNTER_COMPARE_A,
    EPWM1_CMPA);

    //
    // Set up counter mode
    //
    EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);
    EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
    EPWM_setClockPrescaler(myEPWM1_BASE,
    EPWM_CLOCK_DIVIDER_1,
    EPWM_HSCLOCK_DIVIDER_1);
    //
    // Set up shadowing
    //
    EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE,
    EPWM_COUNTER_COMPARE_A,
    EPWM_COMP_LOAD_ON_CNTR_ZERO);//没什么屌用,咱只用一个
    //
    // Set actions
    //
    EPWM_setActionQualifierAction(myEPWM1_BASE,
    EPWM_AQ_OUTPUT_A,
    EPWM_AQ_OUTPUT_HIGH,
    EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);//等于CMPA的时候又重新输出高电平
    EPWM_setActionQualifierAction(myEPWM1_BASE,
    EPWM_AQ_OUTPUT_A,
    EPWM_AQ_OUTPUT_LOW,
    EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);//等于0的时候开始输出低电平

    //
    // Interrupt where we will change the Compare Values
    // Select INT on Time base counter zero event,
    // Enable INT, generate INT on 3rd event
    //
    EPWM_setInterruptSource(myEPWM1_BASE, EPWM_INT_TBCTR_PERIOD);//时基寄存器等于1个周期的时候进行触发
    EPWM_enableInterrupt(myEPWM1_BASE);//开启中断
    EPWM_setInterruptEventCount(myEPWM1_BASE, 1U);//经过1次就可以触发
    //
    // Information this example uses to keep track of the direction the
    // CMPA/CMPB values are moving, the min and max allowed values and
    // a pointer to the correct ePWM registers
    //
    }
    void configGPIOs(void)
    {
    //
    // This test is designed for an external loopback between SPIA
    // and SPIB.
    // External Connections:
    // -GPIO25 and GPIO17 - SPISOMI
    // -GPIO24 and GPIO16 - SPISIMO
    // -GPIO27 and GPIO19 - SPISTE
    // -GPIO26 and GPIO18 - SPICLK
    //
    //
    // GPIO17 is the SPISOMIA.
    //
    GPIO_setMasterCore(17, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_17_SPISOMIA);
    GPIO_setPadConfig(17, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC);
    //
    // GPIO16 is the SPISIMOA clock pin.
    //
    GPIO_setMasterCore(16, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_16_SPISIMOA);
    GPIO_setPadConfig(16, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);
    //
    // GPIO19 is the SPISTEA.
    //
    GPIO_setMasterCore(19, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_19_SPISTEA);
    GPIO_setPadConfig(19, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC);
    //
    // GPIO18 is the SPICLKA.
    //
    GPIO_setMasterCore(18, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_18_SPICLKA);
    GPIO_setPadConfig(18, GPIO_PIN_TYPE_PULLUP);//CS
    GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC);
    //
    GPIO_setMasterCore(55, GPIO_CORE_CPU1);
    GPIO_setPinConfig( GPIO_55_SPISOMIA);
    GPIO_setPadConfig(55, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(55, GPIO_QUAL_ASYNC);
    }
    //
    // initEPWM2 - Configure ePWM2
    //
    // updateCompare - Function to update the frequency
    //

回帖(2)

夏日余晖

昨天 15:24

您现在可以对寄存器操作了吗?也就是寄存器写入后可以正确读出来?

建议您使用示波器或逻辑分析仪抓取通信波形,以检查ADC是否按期望时序运行?

如下截图所示,PD_WKEY[3:0]需要写

1001b,才能对PD_STANDBY寄存器进行寄存器写入操作:


我看您寄存器配置使用外部基准电压,但是还配置了REFDAC_A

and REFDAC_B寄存器,因此,如果您软件上使用外部基准电压,那么电路上需要有外部基准电压提供。


举报

张莉

昨天 18:14
从您提供的代码片段来看,有一些关键部分缺失,例如初始化函数和中断服务例程。以下是一些建议和可能的问题点,您可以参考并检查您的代码:

1. 确保您的硬件连接正确。请检查ADS8355与C2000之间的SPI连接是否正确,包括MISO、MOSI、SCK和CS引脚。

2. 确保您已经正确配置了C2000的GPIO引脚。在`configGPIOs()`函数中,您需要配置与ADS8355通信所需的SPI引脚。

```c
void configGPIOs(void) {
    // 配置GPIO引脚为SPI功能
    // 例如:GPIOA0为MISO,GPIOA1为MOSI,GPIOA2为SCK,GPIOA3为CS
}
```

3. 初始化SPI。在`initSPIAMaster()`函数中,您需要配置C2000的SPI接口作为主设备,并设置正确的时钟速率和模式。

```c
void initSPIAMaster(void) {
    // 初始化SPI接口
    // 设置时钟速率和模式
}
```

4. 确保您已经正确实现了SPI中断服务例程`SPIISR()`。在中断服务例程中,您需要处理SPI数据的发送和接收。

```c
__interrupt void SPIISR(void) {
    // 处理SPI数据发送和接收
}
```

5. 在主函数中,您需要调用初始化函数和启动SPI通信。

```c
int main(void) {
    // 初始化设备
    Device_init();

    // 禁用看门狗
    Device_disableWDog();

    // 配置GPIO引脚
    configGPIOs();

    // 初始化SPI接口
    initSPIAMaster();

    // 启动SPI通信
    // ...

    while(1) {
        // 主循环
    }
}
```

6. 确保您已经正确实现了数据发送和接收的逻辑。在主循环中,您需要发送数据到ADS8355并接收采样数据。

请检查您的代码,确保以上步骤都已经正确实现。如果问题仍然存在,请提供更完整的代码,以便进一步分析和解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分