初级会员

- 积分
- 147
- 金钱
- 147
- 注册时间
- 2017-11-8
- 在线时间
- 33 小时
|
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,足够传输了,还是有这个问题
|
|