SPI-SPI主機硬體片選功能使用說明

WCH_CH32發表於2023-04-21

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 );

 

相關文章