亿加合和智能车制作

标题: spi双机通讯的程序问题 [打印本页]

作者: 4829543www    时间: 2009-10-18 20:02
标题: spi双机通讯的程序问题
本帖最后由 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数据寄存器中的数据
}
作者: zdhly0401    时间: 2009-10-18 20:02
端口要首先初始化,另外带调试器调试时候总是读出的数据是:0xff,这是调试器的问题,调试器要把所有寄存器都要读取,所以,读出spi总是0xff,我开始调的时候就是在端口初始化上折腾了几天
作者: wokao    时间: 2009-10-18 20:04
这个....
作者: wokao    时间: 2009-10-18 20:04
这个....
作者: 4829543www    时间: 2009-10-19 16:05
我是把传出来的数据赋值给led,显示8位所传数据,请问楼上的大侠,您所说的端口初始化指什么啊?
作者: laugh007smile    时间: 2009-10-19 18:48
随便看看
作者: zdhly0401    时间: 2009-10-20 22:42
5# 4829543www
我是使用的80脚的xs系列的,spi通信时PM口初始化   MODRR_MODRR4=1; //使用PM口
   DDRM|=0x38; //SCK0=1,MOSI=1,SS0=1:这里要吧输出方向定义了
如果是112管脚的话,也要注意管脚方向问题
作者: qijitao    时间: 2009-11-10 19:13
jianguo
作者: librae8226    时间: 2009-11-15 17:20
学习
作者: hufangwu    时间: 2009-11-15 17:36
通过串口,在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 */
}
作者: 大水杯    时间: 2009-11-17 09:13
"SYNR=0x49;
REFDV=0x43;"记得有范围的。
作者: onli0330    时间: 2010-9-20 23:10
端口初始化的程序最好也给出来一下。。
给个完整的。。
作者: zhangjiarui    时间: 2010-11-25 09:49
学习
作者: spwbaha    时间: 2011-4-3 15:47
路过
作者: 破浪激流    时间: 2012-8-1 19:28
遇到同样的问题,困惑
作者: ai@    时间: 2015-4-19 14:41
您好,刚刚开始学习SPI,想实现两车通讯,也已经看了一些资料了。现在的问题是不知道怎么计算发送数据时间,,和不知道怎么设置从机的通讯地址?? 您可以给我讲讲吗
作者: 强强.    时间: 2020-6-25 10:08
https://blog.csdn.net/qq_40147893/article/details/106762340看看模拟IIC




欢迎光临 亿加合和智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2