智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 19865|回复: 16
打印 上一主题 下一主题

[软件类] spi双机通讯的程序问题

[复制链接]

3

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
威望
216
贡献
39
兑换币
0
注册时间
2009-9-23
在线时间
40 小时
跳转到指定楼层
#
发表于 2009-10-18 20:02:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1贡献
本帖最后由 4829543www 于 2009-10-18 20:07 编辑

我写了一个简单的spi双机的通讯程序,下到片子了以后主机能发,从机也有等待,但从机的时钟线一连到主机的时钟线上,从数据寄存器上读的数就是0xff。不知道是为什么,请问大虾们:从机是如何设定的,有什么说头吗?还有spi传两组数据时,中间需要有间隔吗?
(初始化已设定,32分频,dg128b,
SPI0CR1_SPIE = 0;//允许SPI中断
SPI0CR1_SPE = 1;//允许SPI
SPI0CR1_SPTIE = 0;//发送中断允许位,置位为0较好,否则数据发送完成,容易进入中断
SPI0CR1_CPHA = 0;//时钟相位选择位,
SPI0CR1_CPOL = 1;//时钟极性选择位,1为低电平有效,空闲时为高电平.
SPI0CR2_SPISWAI = 1;//1为等待模式下,时钟禁止
)
void main(void)//主机主程序
{
  SPI_Sdata = 0xaa;
  sysInit();//spi初始化
  EnableInterrupts;
  DDRB = 0XFF;
  while(1)
  SPI_Send(SPI_Sdata);//发送一个数据
  for(;;)
  {} /* wait forever */
}

void main(void)//从机主程序
{
  SPI_Sdata = 0xaa;
  sysInit();//spi初始化
  EnableInterrupts;
  DDRB = 0XFF;
  while(1)
  PORTB = SPI_Receive();//显示接收数据
  for(;;)
  {} /* wait forever */
}

////////发送数据函数
void SPI_Send(unsigned char SPI_Sdata)
{  
SPI0DR = SPI_Sdata;写入数据寄存器
while(0 == SPI0SR_SPIF);//数据寄存满后开始发送
}

////////接收数据函数
unsigned char SPI_Receive(void)
{
while( 0 == SPI0SR_SPIF);//等待SPIDR寄存器数据满
return SPI0DR;//读取SPI数据寄存器中的数据
}

18

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
866
威望
460
贡献
246
兑换币
266
注册时间
2017-2-13
在线时间
80 小时
毕业学校
邱铭杉学院
16#
发表于 2020-6-25 10:08:48 | 只看该作者
回复

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
30
威望
18
贡献
10
兑换币
9
注册时间
2015-4-10
在线时间
1 小时
毕业学校
献县第一中学
15#
发表于 2015-4-19 14:41:34 | 只看该作者
您好,刚刚开始学习SPI,想实现两车通讯,也已经看了一些资料了。现在的问题是不知道怎么计算发送数据时间,,和不知道怎么设置从机的通讯地址?? 您可以给我讲讲吗
回复

使用道具 举报

0

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
225
贡献
55
兑换币
0
注册时间
2010-12-14
在线时间
11 小时
14#
发表于 2012-8-1 19:28:02 | 只看该作者
遇到同样的问题,困惑
回复

使用道具 举报

4

主题

82

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1550
QQ
威望
333
贡献
1179
兑换币
0
注册时间
2009-12-28
在线时间
19 小时
13#
发表于 2011-4-3 15:47:08 | 只看该作者
路过
回复

使用道具 举报

2

主题

203

帖子

0

精华

高级会员

Rank: 4

积分
741
QQ
威望
434
贡献
249
兑换币
0
注册时间
2010-11-1
在线时间
29 小时
12#
发表于 2010-11-25 09:49:49 | 只看该作者
学习
回复

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
威望
199
贡献
47
兑换币
14
注册时间
2010-9-20
在线时间
5 小时
11#
发表于 2010-9-20 23:10:38 | 只看该作者
端口初始化的程序最好也给出来一下。。
给个完整的。。
回复

使用道具 举报

1

主题

36

帖子

0

精华

高级会员

Rank: 4

积分
831
威望
209
贡献
532
兑换币
0
注册时间
2009-10-7
在线时间
45 小时
10#
发表于 2009-11-17 09:13:00 | 只看该作者
"SYNR=0x49;
REFDV=0x43;"记得有范围的。
回复

使用道具 举报

35

主题

168

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1215
威望
416
贡献
249
兑换币
22
注册时间
2009-9-10
在线时间
275 小时
9#
发表于 2009-11-15 17:36:19 | 只看该作者
通过串口,在pc机上得不到正确的数据,这是为什么啊 请指教



#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"



/*************锁相环******************/
void PLL_Init(void){
  //锁相环设置:频率40M
         SYNR=0x49;
         REFDV=0x43;
         while(CRGFLG_LOCK!=1);
         CLKSEL_PLLSEL=1;
}
/***********************************/
void uart_Init(void) {    //40MHZ  波特率9600   8位无校验。
  SCI0CR2=0x0c;
  SCI0BD=0x104;

    SCI0CR2_RIE=0;

}

void uart_sendchar(char *cs) {  //单字符发送函数
  while(SCI0SR1_TDRE==0);
  SCI0DRL=*cs;
}

void uart_sendstring(char *ss){  //字符串发送函数
  while(*ss){
    uart_sendchar(ss);
    ++ss;
  }
}
//***********************************************

void main(void) {
  PLL_Init();
  uart_Init();
  DisableInterrupts;

  uart_sendstring("Hello World!");
   
  for(;;) {} /* wait forever */
  /* please make sure that you never leave this function */
}
回复

使用道具 举报

14

主题

161

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1382
QQ
威望
406
贡献
768
兑换币
10
注册时间
2009-9-4
在线时间
104 小时
8#
发表于 2009-11-15 17:20:54 | 只看该作者
学习
回复

使用道具 举报

0

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
QQ
威望
212
贡献
20
兑换币
0
注册时间
2008-12-22
在线时间
9 小时
7#
发表于 2009-11-10 19:13:29 | 只看该作者
jianguo
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-5 08:50 , Processed in 0.095146 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表