主题中讨论的其他器件: ADS1118、 ADS1115
您好!
我正在尝试在 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
你能帮我解决问题吗?
谢谢。
舍尔文