3774|6

65

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SPI总线操作完成的确认 [复制链接]

我现在有一个程序是用SPI总线进行通讯,主设备进行一次发送数据操作后,如果判断SPI总线已经处理完成;可以再发送其它数据.
如果不知道SPI总线是否完成,当再次发送数据的时候,系统就会发生崩溃现象.
请各位高手,指指.

最新回复

谢谢楼上的几位.. 虽然问题还没有解决,但是还是很感谢你们.  详情 回复 发表于 2008-10-27 16:52
点赞 关注

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个是有SPI控制器决定的, 应该有个寄存器的标志位来指示的。

主机软件决定字节是否发送,SPI控制器决定字节的位是否发送完成。
可以采用轮询或中断的方式。

 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是不是可以做一个事情,每隔一段时间读一下某个标志,看SPI控制器是否完成,完成了就再发送,或者做成双向同步,不知道真正实现的时候是否可行,仅供参考吧
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
能不能给个示例?
我现在不知道为什么有的时候就死掉..半天也没有找出问题.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
SPI总线没有提供忙标志线,一般设备SPI总线都提供一个状态寄存器来进行判断,也可以产生中断,要注意的是,看这个标志位是否是硬件清除的还是软件清除的,如果是软件清除,读完后要把它清除掉。
示例代码,用于LPC2148上的SPI总线。

  1. /**********************************************************/
  2. /*  函数名称 :   SPI_Init                                */
  3. /*  函数功能 : 初始化SPI接口,设置为主机。               */
  4. /*  参数     :  无                                        */
  5. /*  返回值   :  无                                        */
  6. /*--------------------------------------------------------*/
  7. void  SPI_Init(void)
  8. {  
  9.         #if SPI_EN > 0
  10.        
  11.         PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500;        //选择 SPI
  12.                                    
  13.         S0SPCR = (0x00 << 3) |                        // CPHA = 0,
  14.                      (0x00 << 4) |                        // CPOL = 0,
  15.                      (0x01 << 5) |                        // MSTR = 1,SPI  处于主模式
  16.                      (0x00 << 6) |                        // LSBF = 0,SPI据传输MSB(bit7)在先
  17.                  (0x00 << 7);                        // SPIE = 0,SPI中断禁止
  18.        
  19.         S0SPCCR = 8;                  //SPI 时钟预分频(PCLK/8)
  20.        
  21.         #else
  22.        
  23.         IODIR0 |= SCLK | MOSI ;
  24.         IODIR0 &= (~ MISO);
  25.        
  26.         #endif               
  27. }

  28. /**********************************************************/
  29. /*  函数名称 :  SPI_SendData                              */
  30. /*  函数功能 : 通过SPI发送一个字节的数据并接收一字节     */
  31. /*  参数     :  待发送的字节数据                          */
  32. /*  返回值   :  接收到的数据                              */
  33. /*--------------------------------------------------------*/
  34. INT8U SPI_SendData(INT8U data)
  35. {      
  36.         #if SPI_EN == 0 //IO模拟方式
  37.        
  38.         INT8U i,j,temp,rev_data;
  39.        
  40.         temp = data;
  41.         for(i = 0; i <= 7; i++)
  42.     {
  43.                 IO0SET |= SCLK;
  44.                 if(temp & 0x80)
  45.                         IO0SET |= MOSI;
  46.                 else
  47.                         IO0CLR |= MOSI;
  48.                 rev_data <<=1;
  49.                 if(IO0PIN & MISO)
  50.                         rev_data |= 0x01;
  51.                 else
  52.                         rev_data &= 0xFE;
  53.                 for(j=8;j>0;j--);
  54.                 IO0CLR |= SCLK;
  55.                 for(j=8;j>0;j--);
  56.                 temp <<= 1;
  57.         }
  58.         IO0SET |= SCLK;
  59.         return(rev_data) ;
  60.        
  61.         #else
  62.        
  63.         S0SPDR = data;
  64.         while((S0SPSR & 0x80) == 0);         //等待SPI将数据发送完毕
  65.         return(S0SPDR);
  66.        
  67.         #endif
  68. }
复制代码
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
看 状态寄存器
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢楼上的几位..
虽然问题还没有解决,但是还是很感谢你们.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表