主题中讨论的其他器件: 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
你能帮我解决问题吗?
谢谢。
舍尔文 

