Board logo

标题: 关于SPI [打印本页]

作者: 蛋糕超人    时间: 2008-4-19 19:24     标题: 关于SPI

最近想实现 PTR800传输 然而在第一步 在单片机和单片机传输上都不能实现。。。。郁闷坏了
网上也很难找到关于SPI的例程 那位大侠传一个简单我学习一下 谢谢
主的
void SPI_Init (void) { int b;
   SPI0CR1=0x5b;
   SPI0CR2=0x00;
   SPI0BR=0x07;
 
}
void SPI_SendByte(unsigned char dat) {  int b;
       while(SPI1SR_SPTEF==0) ;
      
  SPI0DR=dat;
  while(SPI1SR_SPIF==0);
  b= SPI0DR;
   }
 
从的 接收到的数据 给小灯显示
void SPI_Init (void) {
   int b;
   SPI0CR1=0x4b;
   SPI0CR2=0x08;
   SPI0BR=0x07;
    b=SPI0SR;
}
char SPIRx(void){
  char temp;
  char result;
  temp=SPI0SR;       
  result=SPI0DR;
  return result;
}就是这个简单程序 硬件部分 主机的MISO接从的  主的MOSI接从MOSI 主机SS接5V的高电平 从的SS接地 两个SS是不相连的 还有个始终SCK是相连 大侠们帮我看看哪里出现问题了

[此贴子已经被作者于2008-4-19 19:22:38编辑过]

[此贴子已经被作者于2008-4-19 19:24:19编辑过]


作者: 蛋糕超人    时间: 2008-4-19 19:26

视乎做这个的人比较少~~~    我被这个卡了一星期了   ~~~~~郁闷坏

[此贴子已经被作者于2008-4-19 19:26:40编辑过]


作者: 康桥人    时间: 2008-4-22 20:11

一般用IO口模拟,如果速度不是很快。数据不多,
作者: 蛋糕超人    时间: 2008-4-24 08:54

不行的  我是为做个项目,以后可能有很多的数据需要传送,传感器的视频的等等
作者: kingcathy    时间: 2008-5-15 21:50

/*功能:使用SPI实现对74HC595的控制操作,实现L1-L8流水灯控制.
;系统晶振6MHz,SPI波特率为5KHz
*创建时间:2008-5-15,陈波扬
********************************************************/
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#include"Delay.h" //Delay function
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

uchar disp_tab[28]={0xFF,0,0xFF,0,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,
0x10,0x08,0x04,0x02,0x01,0x00,0x18,0x24,0x42,0x81,0x42,0x24, 0x18,0x00};/*显示数据*/

void SpiInit(void); //SPI初始化
void SpiTx(uchar dat); //SPI发送数据函数
void main(void) {
uchar i;
/* put your own code here */
EnableInterrupts;
DDRB_BIT0=1; //PB0输出
DDRM|=0x38; //SCK0=1,MOSI=1,SS0=1
MODRR_MODRR4=1; //使用PM口
PTM|=0x08;
SpiInit(); //SPI初始化
PTM&=0xF7; //初始化小灯,全亮
SpiTx(0);
PTM|=0x08;
// Delay_6M_s(1);
for(;;)
{
for(i=0;i<28;i++)
{
Delay_6M_ms(400); //延时400ms
PTM&=0xF7;
SpiTx(disp_tab);
Delay_6M_us(100);
PTM|=0x08;
}
} /* wait forever */
/* please make sure that you never leave this function */
}

/**********************SPI初始化************************/
void SpiInit()
{
//设置波特率,波特率=BUSCLK/Diviser;Diviser=(SPPR+1)*2^(SPR+1)
SPI0BR|=0x00; //Diviser=5*2=10,6M晶振下速率为3K
//控制寄存器,配置数据传输格式以及主从机模式
//不使能中断,数据最高位先发送,在时钟上升沿时保持不变,下降沿更新
SPI0CR1|=0x5E; //SPE=1,MSTR=1,CPOL=1,CPHA=1,SSOE=1
// SPI0CR2|=0x10; //使能模式错误
}

/**********************发射端数据*************************/
void SpiTx(uchar dat)
{
uchar k;
uchar temp;
temp=SPI0SR; //清除状态标志位
while(!SPI0SR_SPTEF)
{
k++;
Delay1_6M(0);
if(k>=100)
{
PORTB_BIT0=1; //9S12开发板上小灯亮,报警
return;
}
}//等待输出为空
k=0;
SPI0DR=dat;
while(!SPI0SR_SPIF)
{
k++;
Delay1_6M(0);
if(k>=100)
{
PORTB_BIT0=1; //9S12开发板上小灯亮,报警
return;
}
};//等待发送结束
}


作者: kingcathy    时间: 2008-5-15 21:50

你看下我发的这个程序,IO口是否定义为输出。SPI功能口的输入和输出和DDRx共同定义的

[此贴子已经被作者于2008-5-15 21:51:41编辑过]


作者: 子安    时间: 2008-8-7 08:25

好久没有来论坛   今天突然看见 真是个惊喜  谢谢楼上




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0