SPI主機硬體片選功能使用說明
SPI協議最早的標準,是由摩托羅拉公司制定。在協議使用的過程中,根據實際需求可能會進行一些擴充套件和修改。
在一份由飛思卡爾半導體釋出的SPI V4.01版本規範中,對片選引腳做了如下的描述:The SS/ output feature automatically drives the SS/ pin low during transmission to select external devices and drives it high during idle to deselect external devices.
原文中僅對SPI主機,在操作片選引腳上做出了明確的規定,並未對使用SPI介面的從機做出相應的說明。實際測試發現,在需要片選訊號參與資料收發時要注意,片選訊號線處於空閒時應保持高電平,且在需要進行資料傳輸時,應能夠被SPI主機片選引腳拉低。
SPI主機在使用硬體片選時,除了需要在結構體中配置為硬體模式,還應將片選引腳配置為複用推輓模式,並呼叫SPI_SSOutputCmd函式,開啟對應SPI的硬體片選輸出功能。
下面是以SPI1為例,使用硬體控制片選引腳的程式清單,其中PA4為片選引腳。
1. void SPI_FullDuplex_Init(void)
2. {
3. GPIO_InitTypeDef GPIO_InitStructure = {0};
4. SPI_InitTypeDef SPI_InitStructure = {0};
5.
6. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );
7.
8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11. GPIO_Init( GPIOA, &GPIO_InitStructure );
12.
13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16. GPIO_Init( GPIOA, &GPIO_InitStructure );
17.
18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
20. GPIO_Init( GPIOA, &GPIO_InitStructure );
21.
22. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
24. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
25. GPIO_Init( GPIOA, &GPIO_InitStructure );
26.
27. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
28. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
29. SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
30. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
31. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
32. SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
33. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
34. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
35. SPI_InitStructure.SPI_CRCPolynomial = 7;
36. SPI_Init( SPI1, &SPI_InitStructure );
37.
38. SPI_SSOutputCmd( SPI1, ENABLE );
39.
40. SPI_Cmd( SPI1, ENABLE );