21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 关于STM8S103的SPI从机通信问题 能接收数据 不能发送
发新帖我要提问
返回列表
打印

关于STM8S103的SPI从机通信问题 能接收数据 不能发送

[复制链接]
4384|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
d350998385|  楼主 | 2013-4-25 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我最近在调试一个SPI的从机 用的是STM8S103,能收到主机发送来的数据但是我还想发送给主机数据,SPI只有在主机发送数据的时候才会有SCK信号,要在接收的同时来发送,这一点就不明白了,怎么写才能完成这样的操作。例程如下

/*******************************************************
函数名称:    SPI主设备初始化
函数功能:   
出入口参数:  无
备注:
*********************************************************/
void SPI_Init_Master(void)
{
   SPI_CR1=0x0c;                   //先发送MSB,关闭SPI,波特率为f/4,配置为主设备,空闲低电平,第一个时钟周期开始采样
                                   //第一个时钟边缘开始数据采样
   
   SPI_CR2=0x02;                    //软件管理片选信号
   SPI_ICR=0Xc0;                   //允许接收中断
   SPI_CR1|=0x40;                  //开启SPI
}
uchar a1,b1;
/*******************************************************
函数名称:    SPI
函数功能:   
出入口参数:  无
备注:
*********************************************************/
#pragma vector=SPI_OVR_vector
__interrupt void SPI_IRQHandler(void)
{
    while((SPI_SR&0x01)==0x01)         //判断接收区是否为空,即判断是否接收到数据
    a1=SPI_DR;
    delay(1);
   while((SPI_SR|0x80)==0x80);    //等待通信结束
    b1=a1;                        //将接受到的数取反后发送给主设备
    //SPI_DR=b1;                     //将要发送的b放到SPI_DR中
    //delay(1);                      //延时一会,等待发送完毕
   // while((SPI_SR|0x80)==0x80);    //等待通信结束 */
    //delay(1);
}

相关帖子

沙发
d350998385|  楼主 | 2013-4-26 10:08 | 只看该作者
有没有人 给顶一下啊

使用特权

评论回复
板凳
NE5532| | 2013-4-26 11:15 | 只看该作者
用了中断就不应该用查询,两个互相抢标志,虽然楼主问题可能不仅在这里,但是这个错是原则性的错误。

使用特权

评论回复
地板
d350998385|  楼主 | 2013-4-27 10:48 | 只看该作者
弄好了  准备结贴了 上传代码给大家看看  
/*******************************************************
函数名称:    SPI主设备初始化
函数功能:   
出入口参数:  无
备注:
*********************************************************/
void SPI_Init_Master(void)
{
   SPI_CR1=0x0c;                   //先发送MSB,关闭SPI,波特率为f/4,配置为主设备,空闲低电平,第一个时钟周期开始采样
                                   //第一个时钟边缘开始数据采样
   
   SPI_CR2=0x02;                    //软件管理片选信号
   SPI_ICR=0Xc0;                   //允许接收中断
   SPI_CR1|=0x40;                  //开启SPI
}
  /*******************************************************
函数名称:SPI中断服务函数   
函数功能:   
出入口参数:  无
备注:
*********************************************************/
#pragma vector=SPI_OVR_vector
__interrupt void SPI_IRQHandler(void)
{
  
    while((SPI_SR&0x02)==0x02)         //判断发送区是否为空,即判断是否发送完毕数据
    SPI_DR=a[c1];                              //先把数据放进发送缓冲区 一有接收信号过来 他就把数据发送  边接受变发送全双工  和 主机的接收发送寄存器形成一个16位循环寄存器 在这里完成 数据交换
    while((SPI_SR&0x01)==0x01)         //判断接收区是否为空,即判断是否接收到数据
    a1=SPI_DR;
}

使用特权

评论回复
5
suahatm| | 2013-10-25 13:58 | 只看该作者
大哥可以看看你的源代码吗 还有其他设置 可以参考下吗 我最近也是在做spi的双机通信

使用特权

评论回复
6
何子| | 2015-9-23 13:39 | 只看该作者
楼主,我最近在调试这个也遇到了同样的问题,请问可以参考下你的代码吗?谢谢:handshake

使用特权

评论回复
7
想想婷| | 2017-3-24 21:17 | 只看该作者
d350998385 发表于 2013-4-27 10:48
弄好了  准备结贴了 上传代码给大家看看  
/*******************************************************
函 ...

谢谢

使用特权

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

本版积分规则

5

主题

14

帖子

2

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部