10001|7

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103C8T6的SPI2问题,求救 [复制链接]

在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信号
问下各位大侠,问题可能出在哪里啊,这里先谢谢了
此帖出自stm32/stm8论坛

最新回复

                                 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了,具体问题在哪里,我也有些迷糊  详情 回复 发表于 2010-5-25 22:51
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
测试的时候,我就是写个死循环,一直查询标志位,然后发东西出来
SPI1可以一直有信号发送出来
SPI2就死在查询标志位里面了,没有SCK信号,发不出来,哪里还有
要注意的地方,大侠们,帮看下哈,谢谢了啊!
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 检查一下引脚配置对不对。
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 注意:两个interface的时钟源好像也不一样
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
检查一下引脚配置对不对。
PB13,14,15啊
本来以为是外部电路把信号拉没了,FLASH我就给拿下来了,PB13,14,15都悬空了
结果还是没信号出来。
我把SPI1的外部FLASH 也给拿下来对比了下,SCK信号一样有输出的....
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
注意:两个interface的时钟源好像也不一样
RCC_HCLKConfig   (RCC_SYSCLK_Div1);   
RCC_PCLK2Config  (RCC_HCLK_Div1);
RCC_PCLK1Config  (RCC_HCLK_Div2);  
RCC_ADCCLKConfig (RCC_PCLK2_Div4);  
PCLK2,PCLK1的时钟都配置了啊,一个72M,一个36M
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
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)
                {
                }
        }
}
这个初始化时钟的函数是不可用的
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
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了,具体问题在哪里,我也有些迷糊
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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