Other Parts Discussed in Thread: TM4C123GH6PM
Hi,
This is my first thread here. I'm having trouble setting up my ADS8568 in SW mode. I'm using serial interface, and just trying to start conversion and reading data from the ADC.
I'm running the master device TM4C123GH6PM microcontroller.
To verify that my ADC is soldered to my breakout board correctly, I'm seeing about 0.001mA from my Multimeter.
Please see code and my schematic. Thanks.
-Ianadc8668_sch.sch
#include <stdint.h> #include <stdbool.h> #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/ssi.h" #include "driverlib/cpu.h" #include "utils/uartstdio.h" #include "inc/hw_memmap.h" #include "inc/tm4c123gh6pm.h" #define NUM_SSI_DATA 3 #define SSI0 0x3C // SSI PA2,PA3,PA4,PA5 /* PA2 - SSI0Clk PA3 - SSI0Fss PA4 - SSI0Rx PA5 - SSI0Tx */ uint32_t data32; void PortAInit() { SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; // enable SSI0 module SysCtlDelay(1); GPIO_PORTA_AFSEL_R |= 0x3C; // SSI0 pins GPIO_PORTA_PCTL_R |= 0x222200; // SSI0Tx, SSI0Rx, SSI0Fss, SSI0CLK GPIO_PORTA_DEN_R |= 0x7C; // PA2 - PA6 GPIO_PORTA_AMSEL_R &= ~0x7C; // disabled analog // SSI clock = system clk / (CPSR * (SCR+1)) SSI0_CR1_R = 0x10; // disable SSI0 and Master mode SSI0_CC_R = 0x00; // use system clock for SSI0 SSI0_CPSR_R = 0x2; // Clock Prescale 2 SSI0_CR0_R |= 0x91F; // SCR = 9, TI frame format, 16-bit data. Bit-rate = 1MBPS SSI0_IM_R |= 0x0C; // receive FIFO and EOT interrupt unmasked NVIC_EN0_R = (0x1 << 7); // NVIC enable SSI0 NVIC_PRI1_R |= (0x1 << 29); // NVIC priority 1 SSI0 SSI0_CR1_R |= 0x02; //enable SSI0 } void PortEInit() { SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOE; GPIO_PORTE_DEN_R |= 0x3F; // digital GPIO_PORTE_DIR_R |= 0x3D; // output 0011_1101 GPIO_PORTE_DIR_R &= ~0x02; // input PE1 GPIO_PORTE_AFSEL_R &= ~0x3F; // gpio GPIO_PORTE_IS_R &= ~0x02; // edge-sensitive GPIO_PORTE_IBE_R |= 0x02; // both edge // GPIO_PORTE_IEV_R &= ~0x02; // active low edge GPIO_PORTE_ICR_R |= 0xFF; // clear any pin interrupt GPIO_PORTE_IM_R |= 0x02; // unmask (enable) interrupt NVIC_EN0_R = (0x1 << 4); // NVIC enable GPIOPortE NVIC_PRI1_R |= (0x2 << 5); // NVIC priority 2 GPIOPortE } void PortFInit() { SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF; SysCtlDelay(1); GPIO_PORTF_LOCK_R = 0x4C4F434B; GPIO_PORTF_CR_R |= 0x01; // allow changes to PF0 GPIO_PORTF_DEN_R |= 0x1F; // digital GPIO_PORTF_DIR_R |= 0x0E; // output GPIO_PORTF_PUR_R |= 0x11; //pull up resistor GPIO_PORTF_IS_R &= ~0x11; // edge-sensitive GPIO_PORTF_IBE_R |= 0x11; // both edge // GPIO_PORTF_IEV_R &= ~0x01; // active low edge GPIO_PORTF_ICR_R |= 0x11; // clear any pin interrupt GPIO_PORTF_IM_R |= 0x11; // unmask (enable) interrupt NVIC_EN0_R = (0x1 << 30); // NVIC enable GPIOPortF NVIC_PRI7_R |= (0x2 << 21); // NVIC priority 2 GPIOPortF } void GPIOE_Handler () { uint16_t dout; GPIO_PORTE_ICR_R = 0x02; if(GPIO_PORTE_RIS_R & 0x02){ GPIO_PORTA_DATA_R |= 0x08; // Set pin to HIGH GPIO_PORTF_DATA_R |= 0x04; // LED green ON SysCtlDelay(6666666); // 1s GPIO_PORTF_DATA_R &= ~0x04; // LED green OFF GPIO_PORTA_DATA_R &= ~0x08; // FS triggered } if (SSI0_RIS_R & 0x04){ dout = SSI0_DR_R; while(SSI0_SR_R & 0x10); UARTprintf("Value: %d\n", dout); } UARTprintf("ADC Busy received"); } void GPIOPortFHandler(void) { NVIC_DIS0_R = (0x1 << 30); //disable interrupt Port F SysCtlDelay(41667); //DELAY = desired delay (s) * system clock / 3 // Control frame select if(GPIO_PORTF_RIS_R & 0x01) { // switch 2 pressed // acknowledge PF0 GPIO_PORTF_ICR_R = 0x01; // GPIO_PORTA_DATA_R |= 0x08; // SSI0 Fss HIGH GPIO_PORTE_DATA_R |= 0x01; // FS High GPIO_PORTF_DATA_R |= 0x04; // pressed SysCtlDelay(6666666); // 1s GPIO_PORTF_DATA_R &= ~0x04; // released GPIO_PORTE_DATA_R &= ~0x01; // FS LOW // GPIO_PORTA_DATA_R |= 0x08; // SSI0 Fss HIGH // GPIO_PORTA_DATA_R &= ~0x08; // Falling edge triggered data32 = SSI0_DR_R; while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done UARTprintf("Data: \n"); UARTprintf("%d", data32); } // ready to convert if(GPIO_PORTF_RIS_R & 0x10) { // switch 1 pressed // acknowledge PF4 GPIO_PORTF_ICR_R = 0x10; GPIO_PORTA_DATA_R &= ~0x40; // Set CONV pin to LOW GPIO_PORTF_DATA_R |= 0x08; // Green ON SysCtlDelay(6666666); // 1s GPIO_PORTF_DATA_R &= ~0x08; // Green OFF GPIO_PORTA_DATA_R |= 0x40; // Convert SysCtlDelay(6); GPIO_PORTA_DATA_R &= ~0x40; // Set pin to LOW } NVIC_EN0_R = (0x1 << 30); //reenable interrupt port F } void SSI0_Handler() { uint16_t dout; if (SSI0_RIS_R & 0x04){ dout = SSI0_DR_R; while(SSI0_SR_R & 0x10); UARTprintf("Value: %d\n", dout); } if (SSI0_RIS_R & 0x08){ GPIO_PORTE_DATA_R |= 0x01; // FS HIGH UARTprintf("Tx is empty\n"); } } void ConfigureUART() { SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0; // Configure GPIO Pins for UART mode. GPIO_PORTA_DEN_R |= 0x3; //digital GPIO_PORTA_AFSEL_R |= 0x3; //uart function GPIO_PORTA_PCTL_R |= 0x11; //UART PA1,PA0 UART0_CC_R = 0x5; //PIOSC source 16MHz // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); } int main(void) { CPUcpsid(); // Disable interrupts globally. SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); // system clock 20MHz PortAInit(); PortEInit(); ConfigureUART(); PortFInit(); { CPUcpsie(); // Enable interrupts globally GPIO_PORTE_DATA_R |= 0x0C; // PE2(SW), PE3(SER) GPIO_PORTE_DATA_R &= ~0x30; // PE4(SEL_B), PE5(SEL_CD) GPIO_PORTE_DATA_R |= 0x01; // FS High SSI0_DR_R = 0x0054; // ADC Configuration bits while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done // GPIO_PORTA_DATA_R |= 0x08; // PortA Fss high SSI0_DR_R = 0x0000; // ADC Configuration bits while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done GPIO_PORTE_DATA_R &= ~0x01; // FS LOW SysCtlDelay(100); GPIO_PORTE_DATA_R |= 0x01; // FS HIGH } while(1) { // GPIO_PORTA_DATA_R |= 0x08; // PortA Fss high // SSI0_DR_R = 0xA00A; // ADC Configuration bits // while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done // GPIO_PORTE_DATA_R |= 0x01; // FS High // SSI0_DR_R = 0x8054; // ADC Configuration bits // while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done //// GPIO_PORTA_DATA_R |= 0x08; // PortA Fss high // // SSI0_DR_R = 0x0000; // ADC Configuration bits // while(SSI0_SR_R & 0x10) {}; // wait for serial data shift done // GPIO_PORTE_DATA_R &= ~0x01; // FS LOW } }