打印

STM32F103C8T6的SPI2问题,求救

[复制链接]
8967|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kami03372|  楼主 | 2010-5-24 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103C8T6,系统时钟72M,SPI时钟18M
void SetupSPI(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
SPI_InitTypeDef   SPI_InitStructure;
SPI_I2S_DeInit(SPI2);//Reset SPI2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
  SPI_Cmd(SPI2, DISABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler =  SPI_BaudRatePrescaler_2;//SPI18M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
//SPI_SSOutputCmd(SPI2, DISABLE);
//SPI_NSSInternalSoftwareConfig(SPI2,SPI_NSSInternalSoft_Reset);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
上面这段函数稍微修改成SPI1的,SPI1就可以使用了,SCK引脚也有信号出来了
但是为什么我写成这样来操作SPI2,发送数据根本发送不出来,没有SCK信号
问下各位大侠,问题可能出在哪里啊,这里先谢谢了
沙发
kami03372|  楼主 | 2010-5-25 08:20 | 只看该作者
测试的时候,我就是写个死循环,一直查询标志位,然后发东西出来
SPI1可以一直有信号发送出来
SPI2就死在查询标志位里面了,没有SCK信号,发不出来,哪里还有
要注意的地方,大侠们,帮看下哈,谢谢了啊!

使用特权

评论回复
板凳
香水城| | 2010-5-25 08:37 | 只看该作者
检查一下引脚配置对不对。

使用特权

评论回复
地板
maomao2126| | 2010-5-25 09:32 | 只看该作者
注意:两个interface的时钟源好像也不一样

使用特权

评论回复
5
kami03372|  楼主 | 2010-5-25 09:34 | 只看该作者
检查一下引脚配置对不对。
香水城 发表于 2010-5-25 08:37

PB13,14,15啊
本来以为是外部电路把信号拉没了,FLASH我就给拿下来了,PB13,14,15都悬空了
结果还是没信号出来。
我把SPI1的外部FLASH 也给拿下来对比了下,SCK信号一样有输出的....

使用特权

评论回复
6
kami03372|  楼主 | 2010-5-25 09:38 | 只看该作者
注意:两个interface的时钟源好像也不一样
maomao2126 发表于 2010-5-25 09:32

RCC_HCLKConfig   (RCC_SYSCLK_Div1);   
RCC_PCLK2Config  (RCC_HCLK_Div1);
RCC_PCLK1Config  (RCC_HCLK_Div2);  
RCC_ADCCLKConfig (RCC_PCLK2_Div4);  
PCLK2,PCLK1的时钟都配置了啊,一个72M,一个36M

使用特权

评论回复
7
kami03372|  楼主 | 2010-5-25 22:50 | 只看该作者
void SetSystemClock(void)
{
        /* RCC system reset(for debug purpose) */
        RCC_DeInit();
        /* Enable HSE */
        RCC_HSEConfig(RCC_HSE_ON);
        /* Wait till HSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
        if (RCC_WaitForHSEStartUp()== SUCCESS)        //SUCCESS
        {
                /* Enable Prefetch Buffer */
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                /* Flash 0 wait state */
                FLASH_SetLatency(FLASH_Latency_2);
                //0等待周期,当 0 < SYSCLK < 24MHz ;1等待周期,当24MHz<SYSCLK≤48MHz;2等待周期当48MHz<SYSCLK≤72MHz
                /*AHB_CLOCK, HCLK = SYSCLK */
                RCC_HCLKConfig(RCC_SYSCLK_Div1);
                /* APB1,low speed,max_36MHz,PCLK1 = HCLK */
                RCC_PCLK1Config(RCC_HCLK_Div2);
                /* APB2,high speed,max_72MHz,PCLK2 = HCLK */
                RCC_PCLK2Config(RCC_HCLK_Div1);
                /* ADCCLK = PCLK2/4*/
                RCC_ADCCLKConfig (RCC_PCLK2_Div4);
                /*Config PllSource,HSE*9=72MHz*/
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
                /*ENABLE PLL_CLK*/
                RCC_PLLCmd(ENABLE);
                /* Wait till PLL is ready */
                while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                {}
                /* Select the PLL as system clock source */
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                /* Wait till PLL is used as system clock source */
                while (RCC_GetSYSCLKSource() != 0x08)
                {
                }
                /* Disable the LSE */
                RCC_LSEConfig(RCC_LSE_OFF);
                /* Enable the Internal Low Speed oscillator */
                RCC_LSICmd(ENABLE);
                /* Select the LSI as RTC clock source */
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
                /* Enable the RTC clock */
                RCC_RTCCLKCmd(ENABLE);
                /* Enable ALL clocks */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
                /* Enable BKP and PWR clocks */
//                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_SPI2,ENABLE);
                /* Enable the Clock Security System */
                //RCC_ClockSecuritySystemCmd(ENABLE);
                /* Clear the reset flags */
                //RCC_ClearFlag();
                /* SysTick event each 10 ms with input clock equal to 9MHz (HCLK/8)*/
                SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
                while(SysTick_Config(90000)==1)
                {
                }
        }
}
这个初始化时钟的函数是不可用的

使用特权

评论回复
8
kami03372|  楼主 | 2010-5-25 22:51 | 只看该作者
RCC_DeInit ();                        /* RCC system reset(for debug purpose)*/
        RCC_HSEConfig (RCC_HSE_ON);           /* Enable HSE                         */       
        /* Wait till HSE is ready                                                   */
        while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
        RCC_HCLKConfig   (RCC_SYSCLK_Div1);   /* HCLK   = SYSCLK                    */
        RCC_PCLK2Config  (RCC_HCLK_Div1);     /* PCLK2  = HCLK                      */
        RCC_PCLK1Config  (RCC_HCLK_Div2);     /* PCLK1  = HCLK/2                    */
        RCC_ADCCLKConfig (RCC_PCLK2_Div4);    /* ADCCLK = PCLK2/4                   */
        *(vu32 *)0x40022000 = 0x01;           /* Flash 2 wait state                 */
        /* PLLCLK = 8MHz * 9 = 72 MHz                                               */
        RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        RCC_PLLCmd (ENABLE);                  /* Enable PLL                         */
        /* Wait till PLL is ready                                                   */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        /* Select PLL as system clock source                                        */
        RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
        /* Wait till PLL is used as system clock source                             */
        while (RCC_GetSYSCLKSource() != 0x08);
        /* Enable USART1 and GPIOA clock                                            */
        RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
这个是可用的初始化设置,修改成这样以后就可用了SPI2了,具体问题在哪里,我也有些迷糊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

190

帖子

0

粉丝