使用芯片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,不知道何故? |
SPI3的GPIO_PinRemapConfig后可以输出时钟(看很多例程都没有这句话),但还有个问题:一旦用JLINK调试,时钟就乱了,示波器看很不规则,关闭调试后时钟输出波形就正常,不知道何故?