3回答

1收藏

STM32之硬件SPI,

#竞赛 #竞赛 3497 人阅读 | 3 人回复 | 2013-08-24

最近起兴在调试硬件的通信接口,因为感觉硬件和软件模拟方式相比优点很明显,具体的不详说了,下面我上传一个百度上的文档,也是我在调试的时候遇到的一个问题,关于NSS端口电平的问题,我将硬件设置好后发现NSS端口一直是低电平,于是出现了无法连续转换数据的大问题。无奈之下百度之后找到原因,原来是单片机的原因啊……之后将NSS端口改为模拟方式控制,于是我我的程序是半硬件半模拟方式了,心碎啊,我也将核心程序贴
  1. #include "stm32f4xx.h"
  2. /** SPI1 GPIO Configuration       
  3.                  PA4         ------> SPI1_NSS
  4.                  PA5         ------> SPI1_SCK
  5.                  PA6         ------> SPI1_MISO
  6.                  PA7         ------> SPI1_MOSI
  7.         */
  8. u8 SPIx_ReadWriteByte(u8 TxData);
  9. void spi_init(void)
  10. {
  11.                 GPIO_InitTypeDef GPIO_InitStruct;
  12.                 SPI_InitTypeDef SPI_InitStruct;


  13.                 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  14.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//spi1时钟使能

  15.         //Enable SCK, MOSI, MISO and NSS GPIO clocks
  16.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
  17.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  18. //                GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  19.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  20.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  21.                 GPIO_Init(GPIOA, &GPIO_InitStruct);
  22.                
  23.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
  24.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  25.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  26.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  27.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  28.                 GPIO_Init(GPIOA, &GPIO_InitStruct);


  29.         //!!! GPIO_Init is commented because some parameters are missing
  30.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  31.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  32.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
  33.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  34.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  35.                 GPIO_Init(GPIOA, &GPIO_InitStruct);


  36.         //!!! GPIO_Init is commented because some parameters are missing
  37.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  38.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  39.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  40.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  41.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  42.                 GPIO_Init(GPIOA, &GPIO_InitStruct);
  43.                
  44.                 /*Configure GPIO pin alternate function */
  45. //                GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
  46.                
  47.                 /*Configure GPIO pin alternate function */
  48.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);

  49.                 /*Configure GPIO pin alternate function */
  50.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);

  51.                 /*Configure GPIO pin alternate function */
  52.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
  53.                
  54.                


  55.                 SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//双向双线全双工
  56.                 SPI_InitStruct.SPI_Mode=SPI_Mode_Master;//主机模式
  57.                 SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//8帧数据结构
  58.                 SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//时钟悬空高
  59.                 SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//在第二个时钟捕获
  60.                 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件控制CS
  61.                 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//波特率分频256
  62.                 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//从高位开始
  63.                 SPI_InitStruct.SPI_CRCPolynomial = 7;//计算的多项式
  64.                 SPI_Init(SPI1,&SPI_InitStruct);
  65.                 SPI_Cmd(SPI1, ENABLE);
  66.                 SPIx_ReadWriteByte(0xff);                       
  67. }

  68. //SPIx 写入一个数据
  69. //TxData:要写入的字节
  70. //返回值:读取到的字节
  71. u8 SPIx_ReadWriteByte(u8 TxData)
  72. {               
  73.         u8 retry=0;                                        
  74.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)//发送缓存空标志位
  75.                 {
  76.                 retry++;
  77.                 if(retry>200)return 0;
  78.                 }                          
  79.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPI发送
  80.         retry=0;

  81.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//接收缓存空标志位
  82.                 {
  83.                 retry++;
  84.                 if(retry>200)return 0;
  85.                 }                                                              
  86.         return SPI_I2S_ReceiveData(SPI1); //通过spi接收的数据                                    
  87. }
复制代码
上来了,请大家拍砖!

STM32_SPI_NSS问题(二篇文章).pdf

162.22 KB, 下载次数: 12

分享到:
回复

使用道具 举报

回答|共 3 个

倒序浏览

沙发

哇哈哈0608

发表于 2013-8-24 12:34:48 | 只看该作者

我是用的TPL0501数字电位能否正确转换作为是否通信成功的标志
板凳

蝶舞娇阳

发表于 2013-8-24 13:49:03 | 只看该作者

好像NSS就是没办法自动拉高,ST的官方例程中没有用到硬件的NSS,看来只能软件解决了
地板

哇哈哈0608

发表于 2013-8-24 14:13:37 | 只看该作者

qrs_yrj 发表于 2013-8-24 13:49
好像NSS就是没办法自动拉高,ST的官方例程中没有用到硬件的NSS,看来只能软件解决了 ...

恩恩   是的   我改进的就是用的软件方式
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条