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
}
}







