cancel
Showing results for 
Search instead for 
Did you mean: 

SPI handle structure did not write and shift the register

WM_IR
Senior

I have declared my SPI2 base address:

#define PERIPH_BASE 0x40000000U 

#define APB1PERIPH_BASE PERIPH_BASE 

#define SPI2_BASEADDR (APB1PERIPH_BASE + 0x3800)

I have a SPI Handle structure:

typedef struct

{

SPI_RegDef_t *pSPIx; //This holds the base address of SPIx peripheral

SPI_Config_t SPIConfig;

uint8_t *pTxBuffer; //to store the application's Tx buffer address because this will reused by the ISR code

uint8_t *pRxBuffer; //to store the application's Rx buffer address.

uint32_t TxLen; //to store Tx Len

uint32_t RxLen; // to store Rx Len

uint8_t TxState; //to store Tx state

uint8_t RxState; //to store Rx state

}SPI_Handle_t;

Then, I have SPI register definition structure:

typedef struct

{

__vo uint32_t CR1; //can get all the SPI register dalam reference manual SPI section (SPI register map)

__vo uint32_t CR2;

__vo uint32_t SR;

__vo uint32_t DR;

__vo uint32_t CRCPR;

__vo uint32_t RXCRCR;

__vo uint32_t TXCRCR;

__vo uint32_t I2SCFGR;

__vo uint32_t I2SPR;

}SPI_RegDef_t;

Then, I do my SPI2 initialization functions:

void SPI2_Inits(void)

{

SPI_Handle_t SPI2handle; //1st, initialize spi2 handle

SPI2handle.pSPIx = SPI2; //initialize SPI base address

SPI2handle.SPIConfig.SPI_BusConfig = SPI_BUS_CONFIG_FD; //SPI configuration bus use full duplex

SPI2handle.SPIConfig.SPI_DeviceMode = SPI_DEVICE_MODE_MASTER; //jadikan device kita sebagai master kita xdk slave utk exercise ni

SPI2handle.SPIConfig.SPI_SclkSpeed = SPI_SCLK_SPEED_DIV8; //sebab kita nak 2MHz so kne divide by 8

SPI2handle.SPIConfig.SPI_DFF = SPI_DFF_8BITS; //set data format to 8 bits

SPI2handle.SPIConfig.SPI_CPOL = SPI_CPOL_LOW; //LOW to default value

SPI2handle.SPIConfig.SPI_CPHA = SPI_CPHA_LOW; //LOW to default value

SPI2handle.SPIConfig.SPI_SSM = SPI_SSM_DI; //software slave management, disable ssm for NSS pin, sebab kita guna hardware

SPI_Init(&SPI2handle); //call spi init dan send all the address of SPI2handle

}

Then, my main code wants to execute this function:

SPI_SendDataIT(&SPI2handle,&dummy,1);

The SPI_SendDataIT function is:

uint8_t SPI_SendDataIT(SPI_Handle_t *pSPIHandle, uint8_t *pTxBuffer, uint32_t Len)

{

uint8_t state = pSPIHandle->TxState;

if(state != SPI_BUSY_IN_TX)

{

pSPIHandle->pTxBuffer = pTxBuffer;

pSPIHandle->TxLen = Len;

pSPIHandle->TxState = SPI_BUSY_IN_TX;

pSPIHandle->pSPIx->CR2 |= ( 1 << SPI_CR2_TXEIE );

}

return state;

}

The problem is, in the SPI_SendData() function at the line

pSPIHandle->pSPIx->CR2 |= ( 1 << SPI_CR2_TXEIE );

where the pSPIHandle did not shift the register of CR2 inside the pSPIx address which is SPI2. In this case, I want to SET the TXEIE, but this line did not SET it.

where the SPI_CR2_TXEIE I declared in:

#define SPI_CR2_RXDMAEN 0

#define SPI_CR2_TXDMAEN 1

#define SPI_CR2_SSOE 2

#define SPI_CR2_NSSP 3

#define SPI_CR2_FRF 4

#define SPI_CR2_ERRIE 5

#define SPI_CR2_RXNEIE 6

#define SPI_CR2_TXEIE 7

#define SPI_CR2_DS 8

#define SPI_CR2_FRXTH 12

#define SPI_CR2_LDMA_RX 13

#define SPI_CR2_LDMA_TX 14

I dont find where is the fault in my code. Could someone help me? Im using stm32f302r8

This discussion is locked. Please start a new topic to ask your question.
10 REPLIES 10

Already found the solution, It seems the udemy course is wrong. they declare pSPIhandle locally inside the SPI_inits functions.

But then, the main program need to use the pSPIhandle. So, should declare globally. Thank you TDK for you responses and help