Hello,
I'm trying to use spi communication between TM4C129ENCPDT and SST25VF016B.
I read some other post in forum but couldn't achieve send and read any byte. I can read JEDEC ID. Here you have my code. Waiting for responses.
//INITIALIZATION
unsigned long ui32Trash;
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1); //MISO//RX LINE
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0); //MOSI//TX LINE
GPIOPinConfigure(GPIO_PD2_SSI2FSS);
GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
SSIAdvModeSet(SSI2_BASE,SSI_ADV_MODE_WRITE);
SSIAdvFrameHoldEnable(SSI2_BASE);
SSIEnable(SSI2_BASE);
while(SSIDataGetNonBlocking(SSI2_BASE, &ui32Trash)){}
}
Some Functions
//Chip Select Enable, PD2
void CE_Set(void){
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_PIN_2);
}
//Chip Select Disable, PD2
void CE_Clear(void){
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, 0);
}
//Write Protect Enable, PQ0
void WP_Set(void){
GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_0, GPIO_PIN_0);
}
//Write Protect Disable, PQ0
void WP_Clear(void){
GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_0, 0);
}
Sending a Byte Routine :
uint8_t tx_data = 0x11;
uint32_t ui32Address = 0x012345;
WP_Clear();
CE_Clear();
SSIAdvModeSet(SSI2_BASE, SSI_ADV_MODE_WRITE);
SSIAdvDataPutFrameEnd(SSI2_BASE, 0x50);
CE_Set();
CE_Clear();
SSIAdvModeSet(SSI2_BASE, SSI_ADV_MODE_WRITE);
SSIDataPut(SSI2_BASE, 0x01);
SSIAdvDataPutFrameEnd(SSI2_BASE, 0x00);
CE_Set();
CE_Clear();
SSIAdvModeSet(SSI2_BASE, SSI_ADV_MODE_WRITE);
SSIAdvDataPutFrameEnd(SSI2_BASE, 0x06);
CE_Set();
CE_Clear();
SSIAdvModeSet(SSI2_BASE,SSI_ADV_MODE_WRITE);
SSIAdvFrameHoldEnable(SSI2_BASE);
SSIDataPut(SSI2_BASE,0x02);
SSIDataPut(SSI2_BASE, (ui32Address >> 16) & 0xff);
SSIDataPut(SSI2_BASE, (ui32Address >> 8) & 0xff);
SSIDataPut(SSI2_BASE, ui32Address & 0xff);
SSIAdvDataPutFrameEnd(SSI2_BASE,tx_data);
CE_Set();
Reading a Byte Routine:
unsigned long ui32MfgID;
uint32_t ui32Address = 0x012345;
CE_Clear();
SSIAdvModeSet(SSI2_BASE,SSI_ADV_MODE_READ_WRITE);
SSIDataPut(SSI2_BASE,0x03);
SSIDataPut(SSI2_BASE, (ui32Address >> 16) & 0xff);
SSIDataPut(SSI2_BASE, (ui32Address >> 8) & 0xff);
SSIDataPut(SSI2_BASE, ui32Address & 0xff);
SSIAdvDataPutFrameEnd(SSI2_BASE, 0x00);
SSIDataGet(SSI2_BASE, &ui32MfgID);
CE_Set();
I see FF as output.
Read Jedec ID :
uint32_t a,b,c,d;
SSIAdvModeSet(SSI2_BASE,SSI_ADV_MODE_READ_WRITE);
SSIDataPut(SSI2_BASE, 0x9F);
SSIDataPut(SSI2_BASE, 0x00);
SSIDataGet(SSI2_BASE, &a); // Read Manufacture ID
SSIDataPut(SSI2_BASE, 0x00);
SSIDataGet(SSI2_BASE, &b); // Read Manufacture ID
SSIDataPut(SSI2_BASE, 0x00);
SSIDataGet(SSI2_BASE, &c); // Read Manufacture ID
SSIAdvDataPutFrameEnd(SSI2_BASE,0x00);
SSIDataGet(SSI2_BASE, &d);
I see FF BF 25 41 as output.