完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这几天在调试STM32F4的SPI,通过自发自收测试代码,发现一个问题,就是当SPI1主发送时,波特率必须设为二分频,SPI2才能收到数据,若设为4分频或8分频,程序开在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 循环里,不知为什么?
以下是全部代码 #include"stm32F4xx.h" void RCC_Configuration(void); void GPIO_Configuration(void); void SPI_Configuration(void); void Delay(int nCount); int main(void) { RCC_Configuration(); GPIO_Configuration(); SPI_Configuration(); while(1) { int data=0; SPI_SendData(SPI1,0x55); while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); data=SPI_ReceiveData(SPI2); if(data==0x55) { while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_4); Delay(0xfffff); GPIO_ResetBits(GPIOA,GPIO_Pin_4); Delay(0xfffff); }; } else while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_4); //Delay(0xfffff); //GPIO_ResetBits(GPIOA,GPIO_Pin_5); //Delay(0xfffff); }; } } void RCC_Configuration() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE); } void GPIO_Configuration() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOA,&GPIO_InitStructure); 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_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_Init(GPIOB,&GPIO_InitStructure); } void SPI_Configuration() { SPI_InitTypeDef SPI_InitStructure; GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); 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_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; SPI_Init(SPI1, &SPI_InitStructure); SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI1,ENABLE); SPI_Cmd(SPI2,ENABLE); } void Delay(int nCount) { int c1=nCount; int c2=nCount; for(;c1>0;c1--) { for(;c2>0;c2--); }; } |
|
相关推荐
6个回答
|
|
The slave clock does not need to be set.初始化SPI2的时候,用2分频默认初始化就可以了。
|
|
|
|
回复第 2 楼 于2014-01-23 10:43:31发表:
The slave clock does not need to be set.初始化SPI2的时候,用2分频默认初 哦,好的~~ |
|
|
|
楼主后来在同一块板子上SPI1与SPI2通信成功了吗?为什么我的程序只要先用SPI1发送就会卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);没办法读到SPI2的值?
SPI_SendData(SPI1,0x55); while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); data=SPI_ReceiveData(SPI2); |
|
|
|
哈哈神神 发表于 2018-11-13 18:03 解决了么? 同问 |
|
|
|
解决了么? 同问
|
|
|
|
没有响应
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:00 , Processed in 0.803655 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号