#include "main.h"
#include "stm32f4_discovery.h"
#include "stm32f4xx_spi.h"
uint8_t aTxBuffer[BUFFERSIZE] = "dkdkdl";
__IO uint8_t aRxBuffer [BUFFERSIZE];
__IO uint8_t ubRxIndex = 0;
__IO uint8_t ubTxIndex = 0;
__IO uint32_t TimeOut = 0;
SPI_InitTypeDef SPI_InitStructure;
void SPIx_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
#ifdef SPI_MASTER
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
SPI_Cmd(SPI1, DISABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;
SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_4 ;
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial =7;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
#endif
#ifdef SPI_SLAVE
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
SPI_Cmd(SPI2, DISABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;
SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_2 ;
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial =7;
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
#endif
}
int main(void)
{
SPIx_Config();
ubTxIndex = 0;
ubRxIndex = 0;
/*
SPIx_Config();
ubTxIndex = 0;
ubRxIndex = 0;
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, ENABLE);
ubTxIndex = 0;
ubRxIndex = 0;
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, ENABLE);
SPI_Cmd(SPI2, ENABLE);*/
//SPI1->DR;
//SPI2->DR;
//while ((ubTxIndex < BUFFERSIZE) && (ubRxIndex < BUFFERSIZE))
#ifdef SPI_MASTER
while ((ubTxIndex < BUFFERSIZE))
#endif
#ifdef SPI_SLAVE
while ((ubRxIndex < BUFFERSIZE))
#endif
{
#ifdef SPI_MASTER
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI1->DR = aTxBuffer[ubTxIndex];
ubTxIndex++;
#endif
#ifdef SPI_SLAVE
while(SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_RXNE)==RESET);
aRxBuffer[ubRxIndex] = SPI2->DR;
ubRxIndex ++;
#endif
}
//SPI_Cmd(SPI1, DISABLE);
//SPI_Cmd(SPI2, DISABLE);
在一块STM32上SPI1传到SPI2上 |