你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 SPI3主模式单线接收时无法输出时钟

[复制链接]
wildeer 提问时间:2021-1-16 18:30 /
使用芯片F103RD,手册显示有SPI3,配置为主模式单线接收,即PB3=SCK, PB4=MISO, 可怎么调都无法输出时钟,特求助高手:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //关闭JTAG开启SWD时开启了AFIO
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);//SPI3 APB1
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);



  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;                //SCK,MOSI,MISO
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);       


        SPI3->CR1  = 0X00;         //复位SPI3->CR1控制寄存器
        SPI3->CR1 &= ~(1<<15);     //双线模式
        SPI3->CR1 &= ~(1<<14);     //只收模式
        SPI3->CR1 &= ~(1<<13);     //禁止CRC
        SPI3->CR1 &= ~(1<<11);   //8位数据模式:
        SPI3->CR1 |= 1<<10;        //仅接收禁止发送,此时MOSI管脚可作为普通GPIO
        SPI3->CR1 |= 1<<9;         //NSS由软件控制
        SPI3->CR1 |= 1<<8;                 //主模式时,NSS必须为高方可设置MSB并使能,如果软件控制NSS,则SSI必须为1才能工作
        SPI3->CR1 &= ~(1<<7);      //MSB传输
        SPI3->CR1 |= 1<<5;                                
        SPI3->CR1 |= 1<<2;        //配置为主设备
        SPI3->CR1 &= ~(1<<1);     //空闲时时钟悬空低
        SPI3->CR1 |=  1<<0;       //第1个时钟采样

        //可不配置以下两句话,I2SCFGR默认复位为0X00
        SPI3->I2SCFGR &=~(1<<11);             //选择SPI模式
        SPI3->I2SCFGR &=~(1<<10);             //关闭I2S模式

        //要关闭SPI3接收中断,允许产生DMA中断,这是SPI与DMA连接的桥梁
        SPI3->CR2 = 0;
        SPI3->CR2 |= 1<<0;     //允许DMA接收数据

        //使能DMA接收
        DMA_DeInit(DMA2_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI3->DR;// 设置DMA源地址:SPI3数据寄存器地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADTemp;  // 内存地址(接收地址变量的指针)
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 方向:从外设到内存
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不增
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  // 内存地址自增
        DMA_InitStructure.DMA_BufferSize = T_DataSize;  //传输大小:以DMA_MemoryDataSize为单位,而不是字节
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据单位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据单位,
       

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA模式,一次或者循环模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  // 优先级:中
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止内存到内存的传输
        DMA_Init(DMA2_Channel1, &DMA_InitStructure);
        SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);

  DMA_ClearFlag(DMA2_FLAG_TC1 | DMA2_FLAG_TE1 ); // 清除DMA所有标志: TC=传输完成,TE=传输错误
  DMA_ITConfig(DMA2_Channel1, DMA_IT_TC, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


以上代码如果改为SPI2,则正常输出SCK,不知道何故?

收藏 评论4 发布时间:2021-1-16 18:30

举报

4个回答
废鱼 回答时间:2021-1-16 19:01:33
GPIO_PinRemapConfig这个函数重映射一下SPI3测试。
网络孤客 回答时间:2021-1-18 09:51:08
用CubeMX吧,减少这类事情发生,把精力更多放在功能上。
大陶 回答时间:2021-1-18 10:42:37
我有写好的SPI3 你需要吗?但是没有用DMA
wildeer 回答时间:2021-1-18 11:51:07
谢谢大家,添加
SPI3的GPIO_PinRemapConfig后可以输出时钟(看很多例程都没有这句话),但还有个问题:一旦用JLINK调试,时钟就乱了,示波器看很不规则,关闭调试后时钟输出波形就正常,不知道何故?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版