Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1189978
  • 博文数量: 221
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2139
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(221)

文章存档

2024年(6)

2023年(8)

2022年(2)

2021年(2)

2020年(29)

2019年(11)

2018年(23)

2017年(41)

2016年(76)

2015年(23)

我的朋友
最近访客

分类: LINUX

2018-12-16 22:09:19

SPI波形要按bit倒过来看。如果从低位开始发送。



图片
图片
图片

 
图片

图片

图片

图片

图片

//-----------------------函数声明,变量定义--------------------------------------------------------
#include
#include
sbit SCK=P1^0;                          // 将p1.0口模拟时钟输出
sbit MOSI=P1^1;                         // 将p1.1口模拟主机输出
sbit MISO=P1^2;                         // 将p1.1口模拟主机输入
sbit SS1=P1^3;                          // 将p1.1口模拟片选
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                 
//--------------------------------------------------------------------------------------------------
// 函数名称: SPISendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//--------------------------------------------------------------------------------------------------
void SPISendByte(uint8_t ch)
{
        uint8_t idata n=8;     // 向SDA上发送一位数据字节,共八位     
        SCK = 1 ;                  //时钟置高
        SS1 = 0 ;                  //选择从机
 
 while(n--)
 {
          delayNOP();
          SCK = 0 ;                  //时钟置低
          if((ch&0x80) == 0x80){    // 若要发送的数据最高位为1则发送位1     
          SDA_MOSI = 1;    // 传送位1
          }
         else{ 
         SDA_MOSI = 0;    // 否则传送位0
         }
         delayNOP();
         ch = ch<<1;        // 数据左移一位
         SCK = 1 ;                  //时钟置高
 }
}
//--------------------------------------------------------------------------------------------------
// 函数名称: SPIreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//--------------------------------------------------------------------------------------------------
uint8_t SPIreceiveByte()
{
  uint8_t idata n=8;    // 从MISO线上读取一上数据字节,共八位
  uint8_t tdata;
        SCK = 1;                   //时钟为高
        SS1 = 0;                   //选择从机
 while(n--)
 {      
    delayNOP();
    SCK = 0;                   //时钟为低
    delayNOP();
    tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
    if(SDA_MISO == 1)
    tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
    else
    tdata = tdata&0xfe;    // 否则数据的最后一位置0
    SCK=1;
 }
  return(tdata);
}
 



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

static void SPI_Start(u8 ch)
{
//初始化
SPI_SCL_L();
SPI_SDA_H();
SPI_delay();
SPI_CS_L();
SPI_CSII_L();
SPI_delay();
}

//IIC停止位
static void SPI_Stop(u8 ch)
{
SPI_SCL_L();
SPI_SDA_H();
SPI_CS_H();
SPI_CSII_H(); //eason
SPI_delay();
SPI_SCL_H();
SPI_delay();
}

//Send Byte(LSB)
static void SPI_SendByte(u8 cData, u8 cLen) 
{
u8 i=cLen;

while(i--)
{
if(cData & 0x01)
SPI_SDA_H(); 
else
SPI_SDA_L();  

cData >>= 1;

SPI_delay();
SPI_SCL_H();
SPI_delay();
SPI_SCL_L();
SPI_delay();
}
}

//Receive Byte(LSB)
static u8 SPI_ReceiveByte(u8 cLen)
{
u8 k=0,i=cLen;
u8 tmp = 0;
k=8-cLen;
SPI_SDA_H(); 
SPI_delay();
while(i--)
{
tmp >>= 1;
SPI_SCL_H();
SPI_delay();
if(SPI_SDA_IN())
{
tmp |= 0x80;
}
SPI_SCL_L();
SPI_delay();
}
for(;k>0;k--){
tmp>>=1;
}
//
return tmp;
}











 






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