IO口模拟SPI通信C51程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文件所用资源
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;

相关文档
最新文档