查看: 3006|回复: 3

STM32之硬件SPI,

[复制链接]
  • TA的每日心情

    2014-6-11 09:35
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-8-24 12:33:21 | 显示全部楼层 |阅读模式
    分享到:
    最近起兴在调试硬件的通信接口,因为感觉硬件和软件模拟方式相比优点很明显,具体的不详说了,下面我上传一个百度上的文档,也是我在调试的时候遇到的一个问题,关于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

    回复

    使用道具 举报

  • TA的每日心情

    2014-6-11 09:35
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-8-24 12:34:48 | 显示全部楼层
    我是用的TPL0501数字电位能否正确转换作为是否通信成功的标志
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-27 11:54
  • 签到天数: 309 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-8-24 13:49:03 | 显示全部楼层
    好像NSS就是没办法自动拉高,ST的官方例程中没有用到硬件的NSS,看来只能软件解决了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-6-11 09:35
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

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

    恩恩   是的   我改进的就是用的软件方式
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 08:52 , Processed in 0.148466 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.