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.

[参考译文] ADS1118EVM:ADS1118EVM

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1320782/ads1118evm-ads1118evm

器件型号:ADS1118EVM
主题中讨论的其他器件: ADS1118ADS1115

您好!

我正在尝试在 Microchip 开发板上使用 PIC18F87J90控制器来驱动带 SPI 的 ADS1118EVM。 问题是、在写入配置寄存器后、我没有看到它进行转换。 我从 ADS1118的配置寄存器读回的只是配置命令的第一个 MSB 字节、而不是 LSB。 我可以始终读回 MSB、但不能读配置的 LSB、并且读回的数据是垃圾数据。 无论我是将 CS 绑定到 GND 还是使用处理器 GPIO 驱动它、我都会得到的不一致和错误结果都是如此。 我正在使用 UART 将我正在从 SPI 读取的值发布到 putty、这样我可以看到 ADS1118EVM 实时生成的值。

请看一下示例代码以及 DIN、DOUT、SCLK 和 CS 的范围上限。 就 SPI 接口而言、您是否发现任何不正确的地方? 为什么我只将配置的 MSB 写入 ADS 回端、而不将 LSB 回端?

配置寄存器和转换寄存器是否具有与 ADS1115类似的不同地址? 我在寻址或命令中缺少什么吗? 在发送第一条 SPI 命令以更新配置寄存器的内容后、我是否需要发送另一条命令上传至配置寄存器?

如果 CS 引脚连接至 GND、则将 CONFIG reg 设置为 DEFAULT。 如果是这种情况、ADS 会转换还是不转换? 是否需要在外部配置 ADS 以进行转换、或者是否需要在 CS 低电平和默认寄存器设置下进行配置?

ADS1118EVM 是否有任何我需要担心的问题? 是否需要以任何方式修改 ADS1118EVM 以便其可由外部控制器驱动?

在示例代码中、我只是尝试读回我写入配置寄存器的内容。 SPI 写入的前两个字节分别为配置 MSB 和 LSB、之后是使用的两个 SCLK 周期(DIN 设定为低电平)

	
void main (void)
{  
     
   initializeSystem();   // Initialize microcontroller

While(1){

	SPI_Write2(0x44,0x8A,0x00,0x00);   // writes to the config register

        itoa(adcValue,buffer);		//converts to tring	
        EUSART_puts(" Data1 =  ");
        UART_SendString(buffer);	//sends converted string value to UART
        itoa(adcValue2,buffer);
        EUSART_puts(" Data2 =  ");
        UART_SendString(buffer);
	itoa(adcValue3,buffer);			
        EUSART_puts(" Data1 =  ");
        UART_SendString(buffer);
        itoa(adcValue4,buffer);
        EUSART_puts(" Data2 =  ");
        UART_SendString(buffer);
}

}

void initializeSystem()
{   
     
    //Primary Oscillator
    OSCCON  = 0b01010100; // 2Mhz sys clock
    OSCTUNE = 0b00011111; // INTSRC <7>: turn off low-freq internal oscillator, "0", PLLEN <6>: PLL enabled, TUNE <5:0>: Maximum freq setting: "011111"    	
    LCDCONbits.LCDEN = 0; // Disable LCD Driver.

    INTCON2bits.RBPU = 0; // Enable Pull-Up Resistors (needed to use the switches)
    	   
    // Setup interrupts
    INTCONbits.INT0E = 1; // enable external interrupt INT0 (RB0) // ****Warning**** Will kill microcontroller's initial ability to MCLR_n (reset)
    INTCONbits.PEIE = 1; // enable peripheral interrupts 
    INTCONbits.GIE  = 1; // enable global interrupts
    PIE1bits.RC1IE = 1;   // enable EUSART receive interrupt
    PIE3bits.RC2IE = 1;   // enable AUSART receive interrupt
  
 
    EUSART_Init(); // initialize Enhanced Asynchronous USART

    SPI_Master_Init();  // initialize SPI Master

    
}

void SPI_Write2(unsigned char addr, unsigned char data, unsigned char data2, unsigned char data3)
{

   LATFbits.LATF7 = 0;

  SSPBUF = addr;       //config MSB Write
  while(!SSPSTATbits.BF);
   adcValue = SSPBUF;   //Data MSB coming from ADS Read

   SSPBUF = data;       //config LSB Write
   while(!SSPSTATbits.BF);
   adcValue2 = SSPBUF;   //Data LSB from ADS Read


   SSPBUF = data2;      //can be high or low
  while(!SSPSTATbits.BF);
  adcValue3 = SSPBUF;       //Data MSB from ADS CONFIG1
 

   SSPBUF = data3;          //can be high or low
   while(!SSPSTATbits.BF);
   adcValue4 = SSPBUF;         //Data LSB from ADS CONFIG2  

   LATFbits.LATF7 = 1;

}

void SPI_Master_Init()
{    
    TRISCbits.TRISC5= 0;   // RC5/SDO - Output (Serial Data Out)
    TRISCbits.TRISC4= 1;   // RC4/SDI - Input (Serial Data In)
    TRISCbits.TRISC3= 0;   // RC3/SCK - Output (Clock)
    TRISFbits.TRISF7= 0;   // Digital output
    TRISFbits.TRISF6= 0;   // Digital Output
    TRISHbits.TRISH1 = 0;
 
    SSPSTAT = 0b01000000;        // Set SMP=0 and CKE=1. Notes: The lower 6 bit is read only
    SSPCON1 = 0b10100001;        // Enable SPI Master with Fosc/4 (configure for master)   

}

void itoa(unsigned char num, char *str){
    int i =0;
    if (num == 0){
        str[i++] = '0';
        } else {
        while(num != 0){
            int rem = num % 10;
            str[i++] = (char)(rem + '0');
            num = num/10;
        }
        str[i] = '\0';//null terminate
        reverse(str,i);
        }

    
char EUSART_Init()
{
    SPBRG1 = 25; // Baud rate is 2600 Serial peripheral baud rate generator for 2MHz
    TXSTA1bits.SYNC = 0;    // Asynchronous mode for Tx register
    RCSTA1bits.SPEN = 1;    // Serial port enable for Rx register
    TRISCbits.TRISC7 = 1;  // RX1 enable
    TRISCbits.TRISC6 = 1;  // TX1 enable
    RCSTA1bits.CREN = 1;    // Continuous receive enable bit for Rx register
    TXSTA1bits.TXEN = 1;    // Transmit enable bit for Tx register
    TXSTA1bits.BRGH = 0;
    BAUDCON1bits.BRG16 = 0;
     
}

转换寄存器中的数据、而正如您看到的、它不会产生任何结果。

在捕获的示波器 pic 中、通道为:绿色= SCLK、紫色= DIN、黄色= DOUT、蓝色= CS

你能帮我解决问题吗?

谢谢。

舍尔文

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

    您好 Shervin:

    在我看来、您与器件的通信方式有问题、示波器屏幕截图显示未为 CONFIG 寄存器返回任何数据。 您能否放大传输的前8和16位以便我更仔细地看一下时序? 您曾提到您收到了 CONFIG 位 MSB 的数据、但我在此处未看到。 您是否仅通过 PuTTY 看到数据?

    另外、看起来您的示波器屏幕截图显示了不同的信号振幅、您使用什么电压为器件供电? 是否在靠近器件的同一点探测这些信号?

    为回答您的问题、您应该能够从本质上对器件进行写入、此器件不需要寄存器地址、因为只有两个寄存器。 回读两个寄存器的操作以32位 SCLK 突发完成、仅回读转换通过16位 SCLK 突发完成。 如果您拥有 EVM、则可以使用示波器监控 EVM 通信、这是一个很好的器件通信示例。

    谢谢。

    列维德弗里斯

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

    您好、Levi:

    随附的是放大的 pic、正如您所问的。 请检查并查看我是否对 SPI 协议执行了一些愚蠢的操作。 我今天在家里工作,我将能够在星期一收集更多的数据,但现在我已经设置了它在我的家庭办公室和玩它.

    我不确定信号幅度、但两个器件都采用3.3V 电压运行、并且我已将接地。 我似乎很接近了、所以可能存在时间问题。

    这些电路板之间的连接还包括:

    PIC 开发 BRD        ADS1118EVM

    SDO      至           sdi

    sdi        至          SDO

    GPIO      至           CS

    SCK       至           SCLK

    您看到的所有应付图形都是在 ADS1118EVM 的破孔引脚上拍摄的。 我能够同时看到这些线路并在电路板之间建立接口。 我不是只在 Putty 上看到数据、而是在示波器上看到数据、但正如我说的、我只看到一个正确的值。 我已经将这款 PIC DEM LCD 板用于许多领域的接口、它可以很好地与 SPI 配合使用。 我花了10分钟时间让另一个器件使用我在这里发布的相同功能正常工作。  现在、让我们看看下面放大的时序 pic、看看您是否有什么突出的地方可以让我进行实验。

    谢谢。

    舍尔文

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

    您好 Shervin:

    我注意到这里有几个奇怪的地方:

    第一、电压电平似乎低于应有的水平。 器件的 DOUT 仅为2V、而应接近2.64V。

    SPI 位只应在 SCLK 的下降沿发生变化、但我可以看到来自器件和微控制器的数据在下降沿改变数据位、因此您可能需要检查 SPI 模式设置是否正确。

    从 ADS1118返回的数据应在前16位中传送转换数据、在后16位中传送 CONFIG 寄存器值、 但最后16位均为零、因此我不确定您是如何从此数据转换中获得部分配置寄存器的、因为您应该只能从该寄存器接收0x0000。

    查看 EVM 原理图、好像 ADS1118通过一个电平转换器连接到微控制器引脚、该电平转换器两侧都需要供电。 您是否确定要为 EVM 上的两个电压轨供电? 否则、可能会解释通信幅度小于预期的原因、通信路径中未通电的器件也可能解释其他通信问题。

    如果在查看过程中找不到任何问题、我认为下一步是查看器件连接原理图。

    谢谢。

    列维德弗里斯