Hi,
I have interfaced ADS8332 with TM4C123 on SSI2.
Configured clock at 20MHz.
Writing to configuration register CMR + CFR = 0xE7BD. (proded on oscilloscope)
But reading back CFR with 0xC000 I am not getting back 0x7BD.
Please let me know where I am going wrong, attached Is my code and schematics.
Thanks and Regards,
Dileep
#include "board_config.h"
#define SDC_SSI_FLASH_BASE SSI2_BASE
#define SDC_SSI_FLASH_SYSCTL_PERIPH SYSCTL_PERIPH_SSI2
// GPIO for SSI pins
#define SDC_GPIO_PORT_FLASH_BASE GPIO_PORTB_BASE
#define SDC_GPIO_SYSCTL_FLASH_PERIPH SYSCTL_PERIPH_GPIOB
#define SDC_SSI_FLASH_CLK GPIO_PIN_4
#define SDC_SSI_FLASH_TX GPIO_PIN_7
#define SDC_SSI_FLASH_RX GPIO_PIN_6
#define SDC_SSI_FLASH_FSS GPIO_PIN_5
#define SDC_SSI_FLASH_PINS (SDC_SSI_FLASH_TX | SDC_SSI_FLASH_RX | SDC_SSI_FLASH_CLK | \
SDC_SSI_FLASH_FSS)
#define CS_HIGH ROM_GPIOPinWrite(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_FSS, SDC_SSI_FLASH_FSS);
#define CS_LOW ROM_GPIOPinWrite(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_FSS, 0);
volatile uint32_t ADS8332_TimerTick;
volatile uint32_t App_ReadDataCounter;
volatile uint32_t App_ReadData;
void ADS8332_TickHandler(void)
{
ADS8332_TimerTick++;
App_ReadDataCounter++;
if(App_ReadDataCounter > 1000)
{
App_ReadData = 1;
App_ReadDataCounter = 0;
}
}
void ADS8332_delay(uint32_t delay)
{
ADS8332_TimerTick = 0;
while(ADS8332_TimerTick <= delay);
}
void ADS8332_Reset(void)
{
ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, 0);
ADS8332_delay(1);
UARTprintf("ADS8332_Reset\r\n");
ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0);
}
void ADS8332_Conversion(void)
{
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
ADS8332_delay(1);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_PIN_0);
}
void ADS833x_DefaultMode(void)
{
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, 0xF000);
ADS8332_delay(1);
CS_HIGH;
}
void ADS833x_Wakeup(void)
{
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, 0xB000);
ADS8332_delay(1);
CS_HIGH;
}
void ADS833x_ResetCMD(void)
{
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, 0xE000);
ADS8332_delay(1);
CS_HIGH;
}
uint32_t ADS833x_ReadCFRRegister(void) // Read CFR register
{
uint32_t rData0;
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, 0xC000);
ROM_SSIDataGet(SDC_SSI_FLASH_BASE, &rData0);
ADS8332_delay(1);
CS_HIGH;
return rData0;
}
uint32_t ADS833x_WriteCFRRegister(uint32_t value) // Read CFR register
{
uint32_t rData0;
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, value);
ROM_SSIDataGet(SDC_SSI_FLASH_BASE, &rData0);
ADS8332_delay(1);
CS_HIGH;
return rData0;
}
uint32_t ADS833x_ReadData(void) // Read CFR register
{
uint32_t rData0;
CS_LOW;
ROM_SSIDataPut(SDC_SSI_FLASH_BASE, 0xD000);
ROM_SSIDataGet(SDC_SSI_FLASH_BASE, &rData0);
ADS8332_delay(1);
CS_HIGH;
return rData0;
}
void ADS8332_Cyclic(void)
{
if(App_ReadData)
{
ADS833x_WriteCFRRegister(0xE7BD);
ADS8332_delay(1);
UARTprintf("ADS8332_Cyclic : 0x%x\r\n", ADS833x_ReadCFRRegister());
App_ReadData = 0;
}
}
void ADS8332_SPI_Init(void)
{
UARTprintf("ADS8332_SPI_Init\r\n");
/*
* This doesn't really turn the power on, but initializes the
* SSI port and pins needed to talk to the card.
*/
//CONVST
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
/* Configure PB5 as output */
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5);
ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_PIN_5);
/* Enable the peripherals used to drive the SDC on SSI */
ROM_SysCtlPeripheralEnable(SDC_SSI_FLASH_SYSCTL_PERIPH);
ROM_SysCtlPeripheralEnable(SDC_GPIO_SYSCTL_FLASH_PERIPH);
/*
* Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS)
* signal is directly driven to ensure that we can hold it low through a
* complete transaction with the SD card.
*/
ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_TX | SDC_SSI_FLASH_RX | SDC_SSI_FLASH_CLK);
ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_FSS);
ROM_GPIOPinConfigure(GPIO_PB4_SSI2CLK);
// ROM_GPIOPinConfigure(GPIO_PB5_SSI2FSS);
ROM_GPIOPinConfigure(GPIO_PB6_SSI2RX);
ROM_GPIOPinConfigure(GPIO_PB7_SSI2TX);
/*
* Set the SSI output pins to 4MA drive strength and engage the
* pull-up on the receive line.
*/
ROM_GPIOPadConfigSet(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_RX, GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD_WPU);
ROM_GPIOPadConfigSet(SDC_GPIO_PORT_FLASH_BASE, SDC_SSI_FLASH_CLK | SDC_SSI_FLASH_TX | SDC_SSI_FLASH_FSS,
GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
/* Configure the SSI2 port */
ROM_SSIConfigSetExpClk(SDC_SSI_FLASH_BASE, ROM_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 20000000, 16);
ROM_SSIEnable(SDC_SSI_FLASH_BASE);
CS_HIGH;
}
void ADS8332_Init(void)
{
UARTprintf("ADS8332_Init\r\n");
//Reset
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
/* Configure PB0 as output */
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);
ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0);
//EOC
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
/* Configure PF1 as input */
ROM_GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
//CONVST
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
/* Configure PF0 as output */
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_PIN_0);
ADS8332_SPI_Init();
ADS8332_Reset();
ADS833x_ResetCMD();
ADS833x_DefaultMode();
ADS833x_Wakeup();
ADS833x_WriteCFRRegister(0xE7BD);
//ADS833x_WriteCFRRegister(0x0000);
}

