打印
[STM8]

STM8工作在SPI从模式下

[复制链接]
4069|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无为之益|  楼主 | 2015-1-29 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 无为之益 于 2015-1-29 15:56 编辑

用的是STM8S003K3
采用4线制,SCK,MISO,MOSI,NSS,但是MISO,MOSI不能同时传送数据,这样可以吗?
这个特点是由对方限制了的。我现在中断接受到的数据是对的,但发送0xa5时,对方接受到0x4b
沙发
无为之益|  楼主 | 2015-1-29 11:00 | 只看该作者
我的初始化也非常简单
void init_SPI(void)
{
        SPI_CR2=0x02;     
        SPI_CR1=0x58;                  
        SPI_ICR=0x40;                     
}
那四条线的输入输出设置:MISO为推挽输出,其他都是默认悬浮输入
这样对吗?

使用特权

评论回复
板凳
mmuuss586| | 2015-1-29 12:25 | 只看该作者

受主机控制,同时发送接收是不行的;

使用特权

评论回复
地板
无为之益|  楼主 | 2015-1-29 15:57 | 只看该作者
mmuuss586 发表于 2015-1-29 12:25
受主机控制,同时发送接收是不行的;

谢谢

使用特权

评论回复
5
airwill| | 2015-1-29 19:53 | 只看该作者
发送的时候, 自然是同时接收的。
发送0xa5时,对方接受到0x4b, 将0xA5 左移一位加1就是0x4B,可见 SPI 的设置有问题,波形设置不一致。

使用特权

评论回复
6
无为之益|  楼主 | 2015-1-31 10:01 | 只看该作者
airwill 发表于 2015-1-29 19:53
发送的时候, 自然是同时接收的。
发送0xa5时,对方接受到0x4b, 将0xA5 左移一位加1就是0x4B,可见 SPI 的 ...


请教一下,我这里的 接受和发送不能同时进行(对方的软件硬件条件限制了的,对方是主机,我的是从机),那么SPI_CR2的bit6(BDOE)和bit2(RXONLY)怎么相互协调呢?接受的时候好办:这2位分别设成:bit6=0:输入使能;bit2=1:禁止输出
那当我接受完数据,开始准备发送的时候,这2位怎么切换?同时改变吗?还是只改变bit6?
bit6=1:输出使能;bit2=0:全双工(同时发送和接受)?
谢谢版主大人:lol

使用特权

评论回复
7
无为之益|  楼主 | 2015-1-31 11:51 | 只看该作者
airwill 发表于 2015-1-29 19:53
发送的时候, 自然是同时接收的。
发送0xa5时,对方接受到0x4b, 将0xA5 左移一位加1就是0x4B,可见 SPI 的 ...

现在在仿真器运行模式下,收发数据都是对的(用逻辑分析仪抓图),但是在正常供电工作情况下(不接仿真器,直接给目标板供电),只有主机那边发过来的3根线信号,我的 MISO线上一直是没有任何数据出现。这是什么原因导致的呢?

使用特权

评论回复
8
airwill| | 2015-1-31 20:10 | 只看该作者
采用4线制,SCK,MISO,MOSI,NSS,那自然是接受和发送是同时进行的。
所谓的 “接受和发送不能同时进行”那只是把同时接收的数据丢弃罢了。那么怎么完成数据收发,看对方的协议规定而定了。

数据发送过程
在写操作中,数据字被并行地写入发送缓冲器。
当从设备收到时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始(译注:此时第一个位被发送出去)。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,SPI_SP寄存器的TXE标志被设置,如果设置了SPI_CR2寄存器的TXEIE位,将会产生中断。
这是STM32 的写法,我想STM8应该也一样。

使用特权

评论回复
9
无为之益|  楼主 | 2015-2-1 22:45 | 只看该作者
本帖最后由 无为之益 于 2015-2-1 23:01 编辑
airwill 发表于 2015-1-31 20:10
采用4线制,SCK,MISO,MOSI,NSS,那自然是接受和发送是同时进行的。
所谓的 “接受和发送不能同时进行”那只 ...

改版后不好用,回复重复了

使用特权

评论回复
10
无为之益|  楼主 | 2015-2-1 22:56 | 只看该作者
本帖最后由 无为之益 于 2015-2-1 22:59 编辑
airwill 发表于 2015-1-31 20:10
采用4线制,SCK,MISO,MOSI,NSS,那自然是接受和发送是同时进行的。
所谓的 “接受和发送不能同时进行”那只 ...

谢谢版主。
接受的时候是可以设置成只接受的,虽然是用4根线。
我现在的初始化程序改为
我的初始化也非常简单
void init_SPI(void)
{
       SPI_CR1=0x18;   
       SPI_CR2=0x06;   
       SPI_ICR=0x40;
        SPI_CR1|=0x40;                                            
}
只是中断完成以后,转数据发送状态,好像只有全双工模式(发送的时候同时接受)。
SPI_CR2&=0xfb;
我现在遇到的问题是:用仿真器全速运行,所有的波形和逻辑都是对的。但是去掉仿真器,直接给目标板供电,就只有对方(SPI主机)发来的3根线上的信号正确,我丛机SPI的发送MISO线上一直没有数据。
我看香版主在回复另外一个网友用STM32同样的情况,说是刚上电时mcu准备好了,但是SPI外设还没有准备好,需要延时。我不知道STM8是否也有这种情况?(为什么datasheet上没有指出这点?)需要延时多长时间?因为我看了香版主的回复后,在刚上电初始化spi前,加了for(i=65535;i>0;i--){;}
效果还是一样,问题仍然存在。
我系统时钟设置成16MHz

使用特权

评论回复
11
无为之益|  楼主 | 2015-2-1 22:57 | 只看该作者
airwill 发表于 2015-1-31 20:10
采用4线制,SCK,MISO,MOSI,NSS,那自然是接受和发送是同时进行的。
所谓的 “接受和发送不能同时进行”那只 ...

我接受用的中断,发送是用查询的方式

使用特权

评论回复
12
z1xinxin| | 2015-4-2 08:08 | 只看该作者
无为之益 发表于 2015-2-1 22:57
我接受用的中断,发送是用查询的方式

亲 ,搞定了 吗,昨天 SPI 从机模式  搞了一天 木搞定啊  

使用特权

评论回复
13
z1xinxin| | 2015-4-2 09:06 | 只看该作者
无为之益 发表于 2015-2-1 22:57
我接受用的中断,发送是用查询的方式

给分 SPI从机模式的 例程吧 欧巴:)

使用特权

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

本版积分规则

36

主题

237

帖子

1

粉丝