首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于SPI

关于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:40编辑过]

一般用IO口模拟,如果速度不是很快。数据不多,
个人BLOG:http://blog.eccn.com/u/107300/index.htm
不行的  我是为做个项目,以后可能有很多的数据需要传送,传感器的视频的等等

/*功能:使用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;
}
};//等待发送结束
}

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

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

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