智能车制作

 找回密码
 注册

扫一扫,访问微社区

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

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

[复制链接]

3

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
威望
216
贡献
39
兑换币
0
注册时间
2009-9-23
在线时间
40 小时
跳转到指定楼层
1#
发表于 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数据寄存器中的数据
}

3

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
威望
216
贡献
39
兑换币
0
注册时间
2009-9-23
在线时间
40 小时
2#
 楼主| 发表于 2009-10-19 16:05:30 | 显示全部楼层
我是把传出来的数据赋值给led,显示8位所传数据,请问楼上的大侠,您所说的端口初始化指什么啊?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 10:16 , Processed in 0.131486 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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