打印
[STM32L4]

ST大本营+ 近期遇到小问题

[复制链接]
857|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
还是看不穿|  楼主 | 2017-7-26 13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题一:
使用F091RCT6的SPI1,用标准库配置。一般数据传输程序写成如下
u8 dSPIN_Write_Byte(u8 TxData)
{       
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空         
        SPI_SendData8(SPI1, TxData); //通过外设SPIx发送一个byte  数据               
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} //等待接收完一个byte                         
        return SPI_ReceiveData8(SPI1); //返回通过SPIx最近接收的数据       
}
但是数据通讯错误,一直卡在
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} //等待接收完一个byte 
之后网上各种找问题原因都没找到合适的答案,最后只能跟据某网友的解决方法应付一下,就是直接把上一句程序改为
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){;} //等待接收完一个byte                
可以正常通讯,没出现错误。目前也还不知道原因是什么。。。。。。有知道的大神望告知
问题二
使用nucleoF413开发板,用标准库进行配置。大家都知道这个板子是没有焊接外部高速晶振的,需要自己焊接。只是我没有板子上要求的那种晶振,就没有焊接了。但应该也不影响一些基本的使用。比如用标准库写个LED的驱动、按键控制是可以的,也可以正常实现。但是我在用sysTick时钟做延时功能就遇到点问题。延时不准,各种相关的配置都检查了好几遍没发问题,后来在论坛上问了下,都觉的应该是时钟配置的原因。然后我看了下标准库时钟的配置程序,
<div>void SystemInit (void)</div><div>static void SetSysClock(void)<b></b><i></i><u></u><sub></sub><sup></sup><strike></strike>
</div>

这两个函数是关于系统时钟、各种总线时钟等时钟的配置。不过里面的配置基本都是要求HSE做为时钟源时,才实现。那么我先再没有用到HSE。

static void SetSysClock(void)

这个函数里的配置就应该不会生效,只有在
void SystemInit (void)
重置RCC各种寄存的配置被保存下来了。那是不是就可以理解为这个时钟配置的不完善,我们后面若要用到模写功能还需要自己配置一下时钟。sysTick做延时很可能就是时钟没设置好,于是我在mian()函数中添加了下面的函数:
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI );
重字面意思就可以理解,用HSI做系统时钟源。这样一来,延时功能就实现了。不过还是感觉对这个时钟的配置遗漏什么,,,,。如有对这部分知识有见解的望赐教啊。。

分享一点PID算法的资料啊,也是其他网友分享的,先谢过了。总结的很好,希望对大家有用






PID控制算法的C语言实现(完整版).zip

177.71 KB

沙发
mmuuss586| | 2017-7-26 14:02 | 只看该作者
1、while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
改成while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET){;} 看看;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
还是看不穿 + 1
板凳
feelhyq| | 2017-7-26 15:11 | 只看该作者
这个BUSY判断还是很重要的,不管是在串口,I2C,或者SPI中,因为数据放进数据寄存器(SPI_SendData8(SPI1, TxData);)此时还需要经过Shift移位寄存器,即并转串,数据一位一位发送出去,在完全发送出最后一个字节之前会有这么一种状态,发送空,即TXE = 1,只是数据寄存器空了,但是数据并没有发送完成, 数据还在移位寄存器中,BUSY一直会在,直到移位寄存器的数据也没有了才是真正的发送完成,BUSY此时=0; 接收的原理也是一样

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
还是看不穿 + 1
地板
还是看不穿|  楼主 | 2017-7-26 16:32 | 只看该作者
mmuuss586 发表于 2017-7-26 14:02
1、while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
改成while (SPI_I2S_GetFlagSta ...

诶,可以这样吗?我后面试试哈,谢谢

使用特权

评论回复
5
还是看不穿|  楼主 | 2017-7-26 16:46 | 只看该作者
feelhyq 发表于 2017-7-26 15:11
这个BUSY判断还是很重要的,不管是在串口,I2C,或者SPI中,因为数据放进数据寄存器(SPI_SendData8(SPI1,  ...

谢谢你的回复啊!这个BUSY判断是好理解,也让SPI正常工作了。只这里是检查接收区非空RXNE标志,按理说更加直接一点吧,可是就是卡住了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

120

帖子

0

粉丝