OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3029|回复: 3

STM32F071 SPI遇到错位问题,求助

[复制链接]

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-11-8
在线时间
33 小时
发表于 2018-3-31 17:19:19 | 显示全部楼层 |阅读模式
1金钱
在使用STM32F071CB单片机的SPI调试flash,遇到这样一个问题,读取flash的ID命令共需要发送和接收四个字节,正常流程是单片机发0x9f,0xff,0xff,0xff,flash分别上报0xff,0xc2,0x20,0x18,但是实际仿真看到单片机确实发了四个字节,但是接收却只接收到前三个字节0xff,0xc2,0x20,如果单片机再发一个0xff就是发五个字节,那么才能收完四个字节,就像是单片机发第一个字节的时候没能正常接收,而是在发第二个的时候才开始正常接收,造成错位。网上找了很多也没解决,有没有知道的?求助,代码如下:
SPI配置:
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;
        //NVIC_InitTypeDef NVIC_InitStructure;
        //CS¡¢WPÅäÖÃ
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_SetBits(GPIOB,GPIO_Pin_1);//CS
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);//WP
       
        //SPI1ÅäÖÃ
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);//PA5¸′óÃÎaSPI1_SCK
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);//PA6¸′óÃÎaSPI1_MISO
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);//PA7¸′óÃÎaSPI1_MOSI
        //SPI1¾ßìåÅäÖÃ
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//éèÖÃSPI1¤×÷Ä£ê½ÎaÖ÷SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//éèÖÃSPIμÄêy¾Y′óD¡£oSPI·¢Ëí½óêÕ8λ֡½á11
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//ê±Öó¿ÕÏDÎaμí
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//êy¾Y2¶»ñóúμú1¸öê±ÖóÑØ
        SPI_InitStructure.SPI_NSS  = SPI_NSS_Soft;//éèÖÃÎaóéèí¼t£¨ê1óÃSSI룩¿ØÖÆNSSDÅoÅ
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//¶¨òå2¨ìØÂêÔ¤·ÖÆμÖμÎa4  12MHZ
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//êy¾Y′«êä′óMSBλ¿aê¼
        SPI_InitStructure.SPI_CRCPolynomial = 7;//¶¨òåóÃóúCRCÖμ¼ÆËãμĶàÏîê½
        SPI_Init(SPI1, &SPI_InitStructure);
                       
        SPI1->CR2|=0x0001;
        SPI_Cmd(SPI1, ENABLE);



DMA配置:
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
               
        DMA_Cmd(DMA1_Channel2,DISABLE);
        DMA1_Channel2->CPAR=(uint32_t)&(SPI1->DR);
        DMA1_Channel2->CMAR=(uint32_t)(&Flash.data[0]);
        DMA1_Channel2->CNDTR=100;
        DMA1_Channel2->CCR|=0x00002480;               
        DMA_Cmd(DMA1_Channel2, ENABLE);       



波形也看了,四次数据也正常,就是第一次的0xff接收不到,在第二次才接收到,四次数据之间也加了延时,大约8ms,足够传输了,还是有这个问题

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-1 00:50:23 | 显示全部楼层
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-11-8
在线时间
33 小时
 楼主| 发表于 2018-4-2 09:02:05 | 显示全部楼层

查询式的、中断式和DMA式都弄过,一样的结果
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-3 01:47:42 | 显示全部楼层
liweimin134 发表于 2018-4-2 09:02
查询式的、中断式和DMA式都弄过,一样的结果

我们例程初始化完SPI 会发一次0XFF,你试试这个方法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表