TI论坛
直播中

久醉不醒

9年用户 1082经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

ADS8638写寄存器的时候,为什么还有数据输出?


  • ADS8638根据手册上看写寄存器的时候,DOUT应该是0x0000的,但是为什么我写寄存器的时候,同时有数据输出?


    以下是我的代码
    #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File#include "SciSetup.h"#define          LedReg        (*((volatile  Uint16 *)0x41FF))Uint16    *ExRamStart = (Uint16 *)0x100000;void senddata(Uint16 a, int num);#define ALPD GpioDataRegs.GPADAT.bit.GPIO26// Prototype statements for functions found within this file.// interrupt void ISRTimer2(void);void delay_loop(void);void spi_xmit(Uint16 a);void spi_fifo_init(void);void spi_init(void);void error(void);unsigned int Spi_TxReady(void);unsigned int Spi_RxReady(void);void main(void){   Uint16 sdata;  // send data   Uint16 rdata;  // received data   // Step 1. Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the DSP2833x_SysCtrl.c file.   InitSysCtrl();// Step 2. Initalize GPIO: // This example function is found in the DSP2833x_Gpio.c file and// illustrates how to set the GPIO to it's default state.// InitGpio();  // Skipped for this example  // Setup only the GP I/O only for SPI-A functionality// This function is found in DSP2833x_Spi.c   InitXintf16Gpio();        //zq   InitSpiaGpio();   EALLOW;      GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;      GpioCtrlRegs.GPAPUD.bit.GPIO26=0;      GpioCtrlRegs.GPADIR.bit.GPIO26 = 1;      EDIS;// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interrupts    DINT;// Initialize PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.  // This function is found in the DSP2833x_PieCtrl.c file.   InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:   IER = 0x0000;   IFR = 0x0000;   // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR).  // This will populate the entire table, even if the interrupt// is not used in this example.  This is useful for debug purposes.// The shell ISR routines are found in DSP2833x_DefaultIsr.c.// This function is found in DSP2833x_PieVect.c.   InitPieVectTable();        // Step 4. Initialize all the Device Peripherals:// This function is found in DSP2833x_InitPeripherals.c// InitPeripherals(); // Not required for this example   spi_fifo_init();          // Initialize the Spi FIFO   spi_init();                  // init SPI  // Step 5. User specific code:// Interrupts are not used in this example.         LedReg = 0xFF;                        ALPD=1;                  //PowerUP//                 spi_xmit(0x080E);//PowerDown//                spi_xmit(0x0800);//PowerUp     for(;;)      {        // Transmit data             spi_xmit(0x0201);//自动采集              }}         // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:        void delay_loop(){    long      i;    for (i = 0; i < 1000000; i++) {}}void spi_init(){            SpiaRegs.***.all =0x000F;                     // Reset on, falling edge, 16-bit char bits        SpiaRegs.***.all =0x0006;                         // Enable master mode, normal phase,                                                 // enable talk, and SPI int disabled.        SpiaRegs.SPIBRR =0x00FF;        SpiaRegs.***.all =0x008F;                 // relinquish SPI from reset    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission}void spi_xmit(Uint16 a){        Uint16 rdata1;  // received data        if(Spi_TxReady() == 1)        {                SpiaRegs.SPITXBUF=a;        }        while(Spi_TxReady() != 1)        {        }        if(Spi_RxReady() == 1)        {           rdata1 = SpiaRegs.SPIRXBUF;         }        delay_loop();}    void spi_fifo_init()                                                                                {// Initialize SPI FIFO registers    SpiaRegs.SPIFFTX.all=0xA040;    SpiaRegs.SPIFFRX.all=0x204f;    SpiaRegs.SPIFFCT.all=0x0;}  unsigned int Spi_TxReady(void)        //发送就绪{        unsigned int i = 0;        if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1){        i = 0;}else{        i = 1;}        return (i);}unsigned int Spi_RxReady(void)        //接收就绪{        unsigned int i = 0;        if(SpiaRegs.SPISTS.bit.INT_FLAG == 1){        i = 0;}else{        i = 1;}        return (i);}//===========================================================================// No more.//===========================================================================

回帖(3)

傅琦

前天 09:24
   sh手册讲是 Invalid data 并没有说是 Zero.  你可以忽略, 不去在意具体数值
举报

李件杰

前天 09:24
  SPI频率是多少?
发送数据的时序: 7bit register address+R/W+8bit data
举报

周煌煦

前天 17:17
在您提供的代码片段中,您正在尝试使用DSP2833x微控制器与ADS8638进行通信。您提到在写寄存器时,DOUT应该为0x0000,但实际上您观察到有数据输出。这可能是由几个原因导致的:

1. 代码错误:请检查您的代码以确保您正确地配置了SPI接口和ADS8638。确保您正确地设置了SPI时钟、片选信号和其他必要的控制信号。

2. 硬件问题:检查您的硬件连接,确保ADS8638与DSP2833x之间的连接正确无误。检查电源、地线和信号线是否正确连接。

3. ADS8638配置问题:确保您正确地配置了ADS8638的寄存器。根据您的需求,您可能需要设置不同的寄存器值以实现所需的功能。

4. 干扰:在某些情况下,外部干扰可能导致数据输出异常。检查您的电路板是否有可能的干扰源,并尝试采取措施减少干扰。

为了进一步诊断问题,您可以尝试以下步骤:

1. 使用示波器或逻辑分析仪检查SPI接口的信号,确保数据传输正常。

2. 在写寄存器之前和之后读取ADS8638的状态寄存器,以检查寄存器值是否正确。

3. 尝试使用不同的SPI时钟速率,以排除时钟速率不匹配的问题。

4. 如果可能,请使用另一块ADS8638或DSP2833x微控制器进行测试,以排除硬件故障的可能性。

希望这些建议能帮助您找到问题的原因并解决问题。如果您需要更多帮助,请提供更详细的代码和硬件信息。
举报

更多回帖

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