打印

SPI

[复制链接]
1264|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Bonnieeast|  楼主 | 2011-7-24 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
chunyang| | 2011-7-25 00:52 | 只看该作者
关键弄通SPI的接口时序。

使用特权

评论回复
板凳
chen3bing| | 2011-7-25 06:59 | 只看该作者
我写过,不难的。

使用特权

评论回复
地板
406514993| | 2011-7-25 08:03 | 只看该作者
是哦,听大师的话没错的,弄懂SPI时序就很简单啦。

使用特权

评论回复
5
xiaotann| | 2011-7-25 11:46 | 只看该作者
是比较乱

使用特权

评论回复
6
Bonnieeast|  楼主 | 2011-7-25 22:46 | 只看该作者
:)呵呵,谢谢,各位,我会努力的。

使用特权

评论回复
7
Bonnieeast|  楼主 | 2011-7-26 19:55 | 只看该作者
下面是我加工的程序,但始终得不到正确的值。请各位帮下忙。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void SPI_EWDS(void);
sbit CS=P1^0;//片选端
sbit SK=P1^1;//时钟
sbit DI=P1^2;//数据输入
sbit DO=P1^3;//数据输出
uchar wdata=0x02;
uchar Rbyte;
uchar SendBuffer[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void SPI_EWDS()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
   SK=0;
    DI=0;
    SK=1;
   SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    CS=0;
}
bit SPI_Read(uint addr)
{
    uchar i;//Rbyte=0;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    for(i=0;i<9;i++)
    {
        SK=0;
        DI=addr&0x0100;//addr&0000 0001 0000 0000
        SK=1;
        addr<<=1;
    }
    SK=0;
    SK=1;
    for(i=0;i<8;i++)
    {
       Rbyte<<=1;
       SK=0;
        if(DO)  Rbyte|=0x01;
        SK=1;               
    }
    CS=0;
   SPI_EWDS();
    return 1;
}
void SPI_EWEN(void)
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    DI=1;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    CS=0;
}

void SPI_WRITE(uint addr,uchar Wbyte)
{
    uchar i;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    DI=0;
    SK=1;
    SK=0;
    DI=1;
    SK=1;
    for(i=0;i<9;i++)
    {
        SK=0;
        DI=addr&0x0100;//addr&0000 0001 0000 0000
        SK=1;
        addr<<=1;
    }
    for(i=0;i<8;i++)
    {
        SK=0;
        DI=Wbyte&0x80;
        SK=1;
      Wbyte<<=1;
    }
    SK=0;
    CS=0;
   SPI_EWDS();
}
/*void SPI_WRAL()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    DI=1;
    SK=1;

    SK=0;
    CS=0;
}*/
/*void SPI_ERASE(uint addr)
{
    uchar i;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    for(i=0;i<9;i++)
    {
        SK=1;
        DI=addr&0x0100;
        addr<<=1;
        SK=0;
    }
    CS=0;
}*/
/*void SPI_TERAL()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    DI=1;
    SK=1;
    SK=0
    DI=0;
    SK=1;
    SK=0;
    CS=0;
}*/
void main()
{
// unsigned char i;
//  unsigned char temp[10];   
   SPI_WRITE(0x0046,wdata);
   SPI_Read(0x0046);
  while(1)
   {
         P2=0xf0;     //4位全部选通
         P0=SendBuffer[Rbyte];   //显示一样的数据
    /* for(i=0;i<10;i++)
        {
          P2=0xf0;     //4位全部选通
          P0=temp[];   //显示一样的数据
          delay10ms();
        }*/
   }
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void SPI_EWDS(void);
sbit CS=P1^0;//片选端
sbit SK=P1^1;//时钟
sbit DI=P1^2;//数据输入
sbit DO=P1^3;//数据输出
uchar wdata=0x02;//0到9
uchar Rbyte;
uchar SendBuffer[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void SPI_EWDS()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
   SK=0;
    DI=0;
    SK=1;
   SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    CS=0;
}
bit SPI_Read(uint addr)
{
    uchar i;//Rbyte=0;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    for(i=0;i<9;i++)
    {
        SK=0;
        DI=addr&0x0100;//addr&0000 0001 0000 0000
        SK=1;
        addr<<=1;
    }
    SK=0;
    SK=1;
    for(i=0;i<8;i++)
    {
       Rbyte<<=1;
       SK=0;
        if(DO)  Rbyte|=0x01;
        SK=1;               
    }
    CS=0;
   SPI_EWDS();
    return 1;
}
void SPI_EWEN(void)
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    DI=1;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    CS=0;
}

void SPI_WRITE(uint addr,uchar Wbyte)
{
    uchar i;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    DI=0;
    SK=1;
    SK=0;
    DI=1;
    SK=1;
    for(i=0;i<9;i++)
    {
        SK=0;
        DI=addr&0x0100;//addr&0000 0001 0000 0000
        SK=1;
        addr<<=1;
    }
    for(i=0;i<8;i++)
    {
        SK=0;
        DI=Wbyte&0x80;
        SK=1;
      Wbyte<<=1;
    }
    SK=0;
    CS=0;
   SPI_EWDS();
}
/*void SPI_WRAL()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;

    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;

    SK=0;
    DI=1;
    SK=1;

    SK=0;
    CS=0;
}*/
/*void SPI_ERASE(uint addr)
{
    uchar i;
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    for(i=0;i<9;i++)
    {
        SK=1;
        DI=addr&0x0100;
        addr<<=1;
        SK=0;
    }
    CS=0;
}*/
/*void SPI_TERAL()
{
    CS=0;
    SK=0;
    CS=1;
    DI=1;
    SK=1;
    SK=0;
    DI=0;
    SK=1;
    SK=0;
    SK=1;
    SK=0;
    DI=1;
    SK=1;
    SK=0
    DI=0;
    SK=1;
    SK=0;
    CS=0;
}*/
void main()
{
// unsigned char i;
//  unsigned char temp[10];   
   SPI_WRITE(0x0046,wdata);
   SPI_Read(0x0046);
  while(1)
   {
         P2=0xf0;     //4位全部选通
         P0=SendBuffer[Rbyte];   //显示一样的数据
     }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:希望大家常来一起分享知识。https://bbs.21ic.com/static/image/smiley/default/smile.gif

1

主题

50

帖子

1

粉丝