完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
求助各位大神,小弟在用STM32F4 进行SPI通讯,SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控,请问是为啥?
如下图:CS本来都拉低了,SPI一动作,CS就被拉高了,我用的软件模拟CS信号,单独配置的GPIO口,且配置GPIO的函数与初始化SPI函数独立开了。 上图中绿色为CLK,蓝色为MOSI,红色为CS,我配置希望他前8个clk是要拉低的。 我这段波形运行的代码为: void SendDatatoSSD(u8 addr,u16 dat) { u8 a=addr; u8 b=((dat >> 8) & 0xFF); u8 c=(dat & 0xFF); SSD2828_SDC=0; delay_ms(20); SSD2828_SDC=0; SPI1_ReadWriteByte(a); SSD2828_SDC=1; SPI1_ReadWriteByte(c); SPI1_ReadWriteByte(b); } 其中SPI读写函数就是特别常用的如下: u8 SPI1_ReadWriteByte(u8 TxData) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, TxData); // while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // return SPI_I2S_ReceiveData(SPI1); // } SPI 初始化函数和CS GPIO口配置都很常规 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);// GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PB3?′ó??a SPI1 PG SPI SCLK GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PB4?′ó??a SPI1 PG SPI MISO GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PB5?′ó??a SPI1 PG SPI MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;// GPIO_Init(GPIOA, &GPIO_InitStructure);// // RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//?′??SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//í£?1?′??SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //éè??SPIμ¥?ò?ò?????òμ?êy?Y?£ê?:SPIéè???a???????òè???1¤ SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //éè??SPI1¤×÷?£ê?:éè???a?÷SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //éè??SPIμ?êy?Y′óD?:SPI·¢?í?óê?8?????á11 //SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //′?DDí?2?ê±?óμ????D×′ì??a??μ??? SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //′?DDí?2?ê±?óμ????D×′ì??aμíμ??? //SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //′?DDí?2?ê±?óμ?μú?t??ì?±???£¨é?éy?ò???μ£?êy?Y±?2é?ù SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //′?DDí?2?ê±?óμ?μú?t??ì?±???£¨é?éy?ò???μ£?êy?Y±?2é?ù SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSD?o?óéó2?t£¨NSS1ü??£??1ê?èí?t£¨ê1ó?SSI??£?1üàí:?ú2?NSSD?o?óDSSI?????? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //?¨ò?2¨ì??ê?¤·??μμ??μ:2¨ì??ê?¤·??μ?μ?a256 ?÷?μ84M??DD·??μ SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //???¨êy?Y′?ê?′óMSB???1ê?LSB???aê?:êy?Y′?ê?′óMSB???aê? SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC?μ????μ??à??ê? SPI_Init(SPI1, &SPI_InitStructure); //?ù?YSPI_InitStruct?D???¨μ?2?êy3?ê??ˉíaéèSPIx??′??÷ SPI_Cmd(SPI1, ENABLE); SPI1_ReadWriteByte(0xff); } 我后来为了验证是不是SPI动作就把CS拉高,还在CS置0后Delay了一段时间,发现确认SPI移动,CS就被拉高了。波形如下: 这个我就奇了怪了!!!!! 这个问题困扰我3天3夜了,后来我都想不用硬件SPI了,直接用纯软件模拟SPI的各个信号和逻辑。 但来论坛搜了好久,我发现SPI读写函数有好多种,我就换了一种,发现了神奇的事情: u8 SPI1_ReadWriteByte(u8 TxData) { u16 u16Temp; /* Loop while DR register in not emplty */ while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET) { SPI_I2S_ReceiveData(SPI1); } /* Send byte through the SPIx peripheral */ SPI_I2S_SendData(SPI1, TxData); /* Wait to receive a byte */ while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); u16Temp = SPI_I2S_ReceiveData(SPI1); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET); /* Return the byte read from the SPI bus */ return (u8)(u16Temp); } 问题解决了,我刚开始学ARM,用的STM32F4系列,两端代码差别怎么就那么大呢,第一段SPI的读写很常规啊?为啥就出那个问题呢? 我把这个遭遇分享给大家,向大家求教。 最后,经验不足想问问大家: return (u8)(u16Temp); 这种表述是啥意思?一般不是return (u16Temp);就好了吗? 哎,真实苦了我了,求老师啊,我企鹅475437231,求大家批评啊。 |
|
相关推荐
13个回答
|
|
|
|
|
|
我的这个CS是软件模拟的,所以我是刻意先拉低后再在1个byte后拉高的,可是就是不清楚为啥像图1一样SPI一动作就给拉高了。。。 |
|
|
|
我意思是,按照SPI协议来说,CS拉高后就停止通信了。所以,你这个刻意拉高 我就理解 不了了 |
|
|
|
嗯嗯,我现在是比较纠结像我图1抓的波形那样,SPI一动作,我本来拉低的GPIO pin ,居然瞬间被拉高,但我换了另一个函数后就变好,很是奇怪。 |
|
|
|
沉下去了,自己顶一个!
|
|
|
|
“return (u8)(u16Temp);” 的意思是只取变量u16Temp的低8位。
在程序运行中需要这个变量的高八位做存储之类的运算,但是最后需要的结果是这个变量的低八位,所以定义了一个个16位的变量,最后返回的时候只取了低八位。 希望能帮到楼主理解 |
|
|
|
咱咋多 SPI 的问题啊?,我自备板凳旁边来看热闹!
|
|
|
|
你的示波器成功滴引起了我的注意
|
|
|
|
我一开始在想,是不是你的外设有什么特别的地方,就是每次CS一拉低之后,出现了短路的现象?但是根据后面换代码就能解决问题,似乎并不是硬件的原因。
然后想问问,SPI1_Init里面, RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE); 最后到底启用RCC没有呢? |
|
|
|
这个问题因该是类型转换出了问题了,读2个字节数据变成读1个字节而编译器又把1字节的数据编译成2个字节的数据调用时第2个字节刚好又对IO操作的。所以出现IO电平的改变。
|
|
|
|
我觉得应该是类型转换的问题和你CS初始化的问题
|
|
|
|
60user36 发表于 2019-1-7 16:52 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);是复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);是停止复位SPI1 我这样理解没错吧, 确实是换了读写函数就好了,是不是第一次用的读写函数没有先收SPI 导致某个标志位溢出导致的异常呢? |
|
|
|
你在使用这些前,先把CS强制拉高一下试试?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
OpenHarmony稳定性专项分享
12/12/2024, 11:00:00 AM 回顾干簧技术应用:汽车行业新视角
12/11/2024, 6:00:00 AM 回顾OpenHarmony Linux 6.6 内核升级移植分享
12/10/2024, 11:00:00 AM 回顾OpenHarmony性能优化分享
12/5/2024, 11:00:00 AM 回顾OpenHarmony轻量板级移植:STM32移植分享
11/28/2024, 11:00:00 AM 回顾0penHarmony板级移植:龙芯移植适配:DAYU400移植经验分享
11/21/2024, 11:00:00 AM 回顾开发者手机OH5.0切换实践分享
11/19/2024, 11:00:00 AM 回顾OpenHarmony板级移植:RK3568移植分享
11/14/2024, 11:00:00 AM 回顾数据智能系列讲座第4期:预训练的基础模型下的持续学习
10/30/2024, 12:00:00 PM 回顾2024开放原子开源生态大会——开鸿助力产业生态与人才培养分论坛
9/26/2024, 5:30:00 AM 回顾2024开放原子开源生态大会——OpenHarmony生态主题演讲
9/26/2024, 2:00:00 AM 回顾数据智能系列讲座第3期—交流式学习:神经网络的精细与或逻辑与人类认知的对齐
9/25/2024, 12:00:00 PM 回顾2024开放原子开源生态大会——开幕式
9/25/2024, 1:30:00 AM 回顾2024 RISC-V 中国峰会 Day 3 主会场A
8/23/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 3 主会场B
8/23/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 2 主会场A
8/22/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 2 主会场B
8/22/2024, 1:00:00 AM 回顾赛昉科技全场景RISC-V解决方案交流会
8/22/2024, 1:30:00 AM 回顾2024 RISC-V 中国峰会 Day 1 主会场
8/21/2024, 1:00:00 AM 回顾OpenHarmony标准系统: 树莓派移植①
12/19/2024, 11:00:00 AM 回顾小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:58 , Processed in 1.022476 second(s), Total 96, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号
|