2511|2

1071

帖子

7

TA的资源

纯净的硅(中级)

楼主
 

关于STM32的SPI [复制链接]

本帖最后由 dj狂人 于 2015-5-29 11:45 编辑 最近在调小四轴,还没进入PID调参数,卡在了各种通信协议上,郁闷死了
  1. GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );//PORTB时钟使能
RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//SPI1时钟使能
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOA,GPIO_Pin_3); //PA3用作其他用途
  • GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制,软件模式
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
    SPI_Cmd(SPI1, ENABLE); //使能SPI外设
    复制代码这是我初始化SPI1的初始化代码,来来回回看了好几遍没发现什么问题呀。 可使用SPI进行传输数据的时候老是卡在等待发送完成上
    1. u8 SPI1_ReadWriteByte(u8 TxData)
      {
      u8 retry=0;
      /* 当 SPI发送缓冲器非空时等待 */
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//卡在这一步,数据发送完成标志一直没有置位
      /* 通过 SPI1发送一字节数据 */
      SPI_I2S_SendData(SPI1, TxData);
    /* 当SPI接收缓冲器为空时等待 */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);//数据接收完毕时置一
    return SPI_I2S_ReceiveData(SPI1);
    }
    复制代码 有谁遇到这种情况解决的吗
    此帖出自stm32/stm8论坛

    最新回复

    时钟错了,请仔细查看  详情 回复 发表于 2015-5-29 11:41
    点赞 关注
     

    回复
    举报

    2131

    帖子

    0

    TA的资源

    至上芯片

    沙发
     
    时钟错了,请仔细查看
    此帖出自stm32/stm8论坛
     
    个人签名处处留心皆学问!
     

    回复

    1071

    帖子

    7

    TA的资源

    纯净的硅(中级)

    板凳
     
    本帖最后由 dj狂人 于 2015-5-29 12:00 编辑



    是我粗心了,使用SPI1应该这样配置"RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1,ENABLE);",感谢提醒
    此帖出自stm32/stm8论坛
     
     

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

    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表