智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3451|回复: 6
打印 上一主题 下一主题

[软件类] 关于SPI口传输问题的请教!

[复制链接]

1

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
威望
228
贡献
57
兑换币
36
注册时间
2009-3-8
在线时间
9 小时
跳转到指定楼层
1#
发表于 2010-4-10 22:09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
我的程序如下:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12xdp512.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xdp512"
#define uchar unsigned char
#define uint unsigned int
uchar putchar_SPI0(uchar cx)
{
  uchar te;
  PTM_PTM3=0;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  te=SPI0SR;
  while(!(SPI0SR_SPTEF));//检查寄存器是否为空
  SPI0DR=cx;
  while(!(SPI1SR_SPIF));//确认数据传输完毕
  
  //clear the SPIF flag
  PTM_PTM3=1;
}
uchar getchar_SPI0()
{
  PTM_PTM3=0;
  //uchar te;
  //while(!(SPI0SR_SPTEF));
  while(!(SPI0SR_SPIF));
  //te=SPI0DR;
  return(SPI0DR);
  PTM_PTM3=1;
}
void MCU_int()
{
  CLKSEL=0x00;
  PLLCTL_PLLON=1;
  SYNR=2;
  REFDV=1;
  _asm(nop);
  _asm(nop);
  while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
  CLKSEL_PLLSEL =1;          //engage PLL to system;  
   
  PTJ_PTJ0 = 0;
  DDRJ_DDRJ0 = 0;
  PPSJ_PPSJ0 = 1;                 //PTJ上升沿中断
  PIEJ_PIEJ0 = 1;                //中断使能
  PIFJ_PIFJ0 = 0;
  DDRK=0xff;
  PORTK=0xff;
}
void SpiInit()
{
  DDRM|=0x38; //SCK0=1,MOSI=1,SS0=1
  MODRR_MODRR4=1; //使用PM口
  PTM_PTM3=1;
  SPI0CR1=0x52;
  SPI0CR2=0x10;
  SPI0BR=0x04;
  
}
void main(void) {
  uchar m;
  /* put your own code here */
  EnableInterrupts;

  MCU_int();
  SpiInit();
  for(;;)
  {
    putchar_SPI0(0X05);
    getchar_SPI0;
    m=SPI1DR;
    PORTK=0xee;
  } /* wait forever */
  /* please make sure that you never leave this function */
}
为什么总在while(!(SPI1SR_SPIF));处出现死循环,而且数据无法写入SPI0DR;SPI0DR总为0;急盼各位高手的解答
换了几个SPI口结果都一样。。。

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
QQ
威望
245
贡献
28
兑换币
0
注册时间
2011-1-27
在线时间
20 小时
2#
发表于 2011-4-18 21:21:16 | 只看该作者
回复 1# hzy198911


   哥们  真想抱你一下  我也是遇到这个问题了   调了一个多星期了    一直在那里死循环   不过很遗憾啊  现在还没找到毛病在哪里呢
回复

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
QQ
威望
245
贡献
28
兑换币
0
注册时间
2011-1-27
在线时间
20 小时
3#
发表于 2011-4-18 21:55:18 | 只看该作者
我的QQ号453297565   咱俩可以商量商量
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
威望
183
贡献
35
兑换币
6
注册时间
2011-4-25
在线时间
1 小时
4#
发表于 2011-4-26 08:49:51 | 只看该作者
哥们不知道你们怎么解决的 我也是这个问题啊 从SPI0DR里面取出来的数都是255 而且死死循环,
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
威望
183
贡献
35
兑换币
6
注册时间
2011-4-25
在线时间
1 小时
5#
发表于 2011-4-26 08:55:03 | 只看该作者
te=SPI0DR;这一句我是这么写的SPI0DR=te;虽然不出现死死循环,但读出来的数都是255 不明白什么原因哎
回复

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
107
QQ
威望
171
贡献
26
兑换币
0
注册时间
2011-5-11
在线时间
0 小时
6#
发表于 2011-5-11 10:11:01 | 只看该作者
先启动从机,再运行主机
回复

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
威望
280
贡献
79
兑换币
8
注册时间
2012-3-28
在线时间
54 小时
毕业学校
陕科大
7#
发表于 2012-4-19 08:07:25 | 只看该作者
来一个已经验证过的发送和接受的程序,和大家分享。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 01:44 , Processed in 0.365489 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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