cancel
Showing results for 
Search instead for 
Did you mean: 

Configure STM32F4 Discovery as SPI slave?

flukeco
Associate II
Posted on July 02, 2014 at 03:20

Hi,

I want to haveSTM32F4 Discovery as SPI slave and PIC18F2580 as SPI master. I tried to modify examples found on the internet to suit my need, but none of them work. I haveneither access to oscilloscope nor logic analyzer, so it's very difficult for me to understand why the code doesn't work. The following is configuration I'm using for PIC (Master mode): Note: I used this configuration for mastertomake communicationbetween 2 PICs and it worked.

/* SMP: Sample bit 
* SPI Master mode: 
* 1 = Input data sampled at end of data output time 
* 0 = Input data sampled at middle of data output time 
* SPI Slave mode: 
* SMP must be cleared in slave mode 
*/
#define _SMP 0 
/* CKE: SPI Clock Select bit 
* 1 = Transmit occurs on transition from active to idle clock state 
* 0 = Transmit occurs on transition from idle to active clock state 
*/
#define _CKE 0 
/* CKP: Clock Polarity Select bit 
* 1 = Idle state for clock is a high level 
* 0 = Idle state for clock is a low level 
*/
#define _CKP 1 
/* Synchronous Serial Port Mode Select bits 
* 0101 = Slave mode, clock = SCK pin, SS pin disabled (can be used as I/O pin) 
* 0100 = Slave mode, clock = SCK pin, SS pin enabled 
* 0011 = Master mode, clock = TMR2 output/2 
* 0010 = Master mode, clock = Fosc/64 
* 0001 = Master mode, clock = Fosc/16 
* 0000 = Master mode, clock = Fosc/4 
*/
#define _SSPM_MASTER 0b0000 
void
SPI_init() { 
TRISA = 0x00; 
/* set all port A pins as output pins */
ADCON1 = 0x0F; 
/* set all port A pins, including SS (RA5), as digital I/O */
TRISC = 0b00010000; 
/* Set SCK pin (RC3) as output 
* SDI pin (RC4) as input 
* SDO pin (RC5) as output */
SSPSTAT = 0b00000000; 
/* Initialize SSPSTAT register to POR state */
SSPSTATbits.SMP = _SMP; 
/* Configure sample bit */
SSPSTATbits.CKE = _CKE; 
/* Configure clock select bit */
SSPCON1 = 0b00000000; 
/* Initialize SSPCON1 register to POR state */
SSPCON1bits.CKP = _CKP; 
/* Configure clock polarity select bit */
SSPCON1bits.SSPEN = 1; 
/* Enable SPI (set SCK, SDO, SDI, and SS as serial port pins)*/
SSPCON1bits.SSPM = _SSPM_MASTER; 
/* Configure sync mode bits for master */
}

And this is theconfiguration I'm using for STM32F4 Discovery (Slave mode):

void
init_SPI1(
void
) { 
GPIO_InitTypeDef GPIO_InitStruct; 
SPI_InitTypeDef SPI_InitStruct; 
// enable clock for used IO pins 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
/* configure pins used by SPI1 
* PA5 = SCK 
* PA6 = MISO 
* PA7 = MOSI 
*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5; 
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; 
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_Init(GPIOA, &GPIO_InitStruct); 
// connect SPI1 pins to SPI alternate function 
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); 
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); 
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); 
// enable clock for used IO pins 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 
// enable peripheral clock 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 
/* 
* CPOL = 1 --> clock is high when idle 
* CPHA = 0 --> data is sampled at the first edge 
*/
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
// set to full duplex mode, seperate MOSI and MISO lines 
SPI_InitStruct.SPI_Mode = SPI_Mode_Slave; 
// transmit in slave mode 
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; 
// one packet of data is 8 bits wide 
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; 
// clock is high when idle 
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; 
// data sampled at first edge 
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; 
// set the NSS management to internal and pull internal NSS high 
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_LSB;
// data is transmitted MSB first 
SPI_Init(SPI1, &SPI_InitStruct); 
SPI_Cmd(SPI1, ENABLE); 
// enable SPI1 
}

I'm connecting - SCK (PA5) to PIC's SCK (RC3) - MISO (PA6) to PIC's SDI (RC4) - MOSI (PA7) to PIC's SDO (RC5) Any help would be highly appreciated. Thank you in advance for your suggestions and sorry for my bad English. Best Regards, Pat
This discussion is locked. Please start a new topic to ask your question.
0 REPLIES 0