打印
[STM8]

STM8S103 SPI问题请教

[复制链接]
1517|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
joyme|  楼主 | 2014-7-8 20:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用MOSI、SCK实现两个STMS103之间的通信,软件切换主从模式,主模式只发送,从模式只接受
单片机1检测到单片机2连上(通过拉低一个IO口电平实现)则主动发送读取单片机2内部ID,单片机2接到读取命令返回ID数组
通信上之后,单片机1还会发送其他命令让单片机2动作,单片机2接到命令解析,如有长时间的动作则返回接受OK的包,同时做相关动作,动作完成后主动切换到主模式发送动作结果

测试发现,两个单片机通信上之后,如果是发送简单命令(单片机1发送命令,单片机2收到明了后马上切换为主模式发送OK包)基本都能通信成功

但单片机1发送命令(命令发完后立即切换到从模式接受状态),单片机2发送接受OK包后动作(也会切换到从模式),执行动作完成后再切换为主模式发送结果会有很大概率成功不了

同时单片机2断电后上电也有一定概率收不到单片机1的读取ID命令,而且单片机1循环发送都不能成功

切换过程,先检查SPI_BUSY位,发现这个位有可能一直为1,后来我加了一定超时,超时后强行关闭SPI,再切换模式,还是不能成功,搜了一下之前也有些帖子谈论SPI_BUSY位,但没有实际的解决方案。

恳请ST单片机高手或ST的技术支持帮忙解答,不甚感激!
沙发
joyme|  楼主 | 2014-7-8 23:59 | 只看该作者
都要沉了,香版帮忙看看吧

使用特权

评论回复
板凳
joyme|  楼主 | 2014-7-9 09:10 | 只看该作者
这是切换的函数,单片机准备好发送的数据后切换到Master模式,发送完切换到Slave模式等待应答,超时(200ms)没有收到应答包则重试5,重试5次失败则判定为通信失败。
void                set_spi_mode(uint8_t        bMaster)
{
       
                bSwitchCnt.bitval.isNeedSwitch = TRUE;
                bSwitchCnt.bitval.bTimeOut = 2;
                while(SPI_SR & (1 << SPI_BUSY))
                {
                                if(!bSwitchCnt.bitval.isNeedSwitch)
                                                break ;
                }                               
                               
                SPI_CR1 &= (~SPI_ENABLE);
                if(bMaster)
                {
                                SPI_CR1 = /*LSBFIRST + */BRCTRL + MASTER + PHASE_CTRL;                                                                                       
                                SPI_CR2 = /*BDM_EN + BDOE_EN +*/ SSM_EN + SSI_EN;                                                                                                                                                //SSM = 1, SSI = 1  Master Mode
                                SPI_ICR = 0;                                                                                                                                                //Enable RX/TX interrupt
                                SPI_CR1 |= SPI_ENABLE;
                }
                else
                {
                                SPI_CR1 = /*LSBFIRST + */BRCTRL + PHASE_CTRL;                                                                                       
                                SPI_CR2 = /*BDM_EN + RX_ONLY + */SSM_EN;                                                                                                                                                //SSM = 1, SSI = 0  Slave Mode
                                SPI_ICR = 0x40;                                                                                                                                                //Enable RX/TX interrupt
                                SPI_CR1 |= SPI_ENABLE;
                }       
}

使用特权

评论回复
地板
joyme|  楼主 | 2014-7-10 09:36 | 只看该作者
都没人理,算了我也不纠结了,直接换成IO模拟通信吧,结贴了

使用特权

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

本版积分规则

51

主题

1289

帖子

0

粉丝