Chinaunix首页 | 论坛 | 博客
  • 博客访问: 962034
  • 博文数量: 175
  • 博客积分: 2788
  • 博客等级: 少校
  • 技术积分: 2060
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 12:25
个人简介

知之者不如好之,好之者不如乐之

文章分类

全部博文(175)

文章存档

2016年(1)

2015年(20)

2014年(8)

2013年(68)

2012年(16)

2011年(35)

2010年(1)

2008年(26)

分类: 嵌入式

2013-11-14 20:50:22

原文:http://blog.chinaunix.net/uid-10747583-id-3192380.html
http://wxbwds168.blog.163.com/blog/static/12834875020099313565287/
/**************************

文件所用资源
1.端口:P0.4,P0.5,P0.6,P0.7
2.调用delay_ms函数
**************************/
/*************************
    模拟SPI接口I/O定义
*************************/
sbit    spi_cs=P0^1;  
sbit    spi_di=P0^2;  
sbit    spi_clk=P0^3;
sbit    spi_do=P0^4;  
/*******************************
    向SPI器件写入一个字节数据
*******************************/
void spi_write(unsigned char spi_dat)  
{  
unsigned  char  i;  
spi_cs=0;  
for  (i=0;i<8;i++)  
{  
  spi_clk=0;   
  if((spi_dat & 0x80)==0x80)spi_di=1;  
  else spi_di=0;  
        spi_clk=1;   
  spi_dat=(spi_dat<<1);  
}  
spi_cs=1;
}  
/********************************
  从SPI器件读出一个字节数据
********************************/
unsigned char spi_read()  
{  
unsigned char i,spi_dat;  
spi_cs=0;  
   for (i=0;i<8;i++)  
{                                 
  spi_clk=0;  
     spi_dat=(spi_dat<<1);  
     spi_clk=1;  
  if(spi_do==1)spi_dat|=0x01;  
  else spi_dat&=~0x01;  
}  
spi_cs=1;
return spi_dat;  
}

其实光模拟来说,就时序问题,读取和写入一个字节的时序。

首先选4个IO口,作模拟用,分别模拟CS、SCLK、SI、SO.即是片选、时钟、数据输入、数据输出。

  IO口初始化,分别把对应的IO口设置输入输出。CS、SCLK、SO、设置为输出,SI设置为输入。

  然后就是时序问题了,一般如下:

//设要写的数据是abyte表示。

CS_1;              //片选高,
SCLK_1;        //时钟高
CS_0;              //片选低,开始工作。
for(i=0;i<8;i++)//循环产生时钟,写入数据。

{
SCLK_0;          //时钟低,下降沿
if(0x80&abyte)
SO_1;         
else
SO_0;
SCLK_1;
abyte<<=1;
}
SCLK_0;
CS_1;


//设要读的数据是abyte表示。

CS_0;

SCLK_1;

for(i=0;i<8;i++)//读取数据值。
{
SCLK_0;
;;
SCLK_1;
abyte<<=1;
if(in_SI)
abyte++;
}
SCLK_0;
CS_1;

阅读(1758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~