下面是配置SPI2的代码,包括:
1、配置SPI的时钟;
2、复用相关管脚的SPI功能;
3、配置相关参数:数据方向(半双工还是全双工);主机从机模式;数据位长度(8位还是16位);CPHA与CPOL(时钟极性与相位);片选控制方式(硬件还是软件);数据位传输顺序(高位在前还是低位在前);以及CRC校验(复位后为7)
void SPI2_Configuration(void)
{
/* Ó²¼þSPI */
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* ¿ªÆôGPIOʱÖÓ */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* ¿ªÆôSPIʱÖÓ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/* ÅäÖà ´Ó»úµÄSCK, MISO ¡¢ MOSI Ϊ¸´Óù¦ÄÜ */
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* ÉèΪÍÆÍìģʽ */
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* ÉÏÏÂÀµç×費ʹÄÜ */
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; /* IO¿Ú×î´óËÙ¶È */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
/* ÅäÖÃSPI2Ó²¼þ²ÎÊý */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; /* Êý¾Ý·½Ïò£º2ÏßÈ«Ë«¹¤ */
// SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; /* STM32µÄSPI¹¤×÷ģʽ £º÷»úģʽ */
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPI //add by zhongli 2018/6/15
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; /* Êý¾Ý볤¶È £º 16λ */
/* SPI_CPOLºÍSPI_CPHA½áºÏʹÓþö¶¨Ê±ÖÓºÍÊý¾Ý²ÉÑùµãµÄÏàλ¹Øϵ¡¢
±¾ÀýÅäÖÃ: ×ÜÏß¿ÕÏÐÊǸߵçƽ,µÚ2¸ö±ßÑØ£¨ÉÏÉýÑزÉÑùÊý¾Ý)
*/
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; /* ʱÖÓÉÏÉýÑزÉÑùÊý¾Ý */
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; /* ʱÖӵĵÚ2¸ö±ßÑزÉÑùÊý¾Ý */
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; /* Ƭѡ¿ØÖÆ·½Ê½£ºÈí¼þ¿ØÖÆ */
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Êý¾Ýλ´«Êä´ÎÐò£º¸ßλÏÈ´« */
SPI_InitStructure.SPI_CRCPolynomial = 7; /* CRC¶àÏîʽ¼Ä´æÆ÷£¬¸´Î»ºóΪ7¡£±¾Àý³Ì²»Óà */
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE); /* ʹÄÜSPI */
SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_RXNE);
SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_TXE);
}
|