发新帖我要提问
12
返回列表
打印

IO口模拟SPI时序

[复制链接]
楼主: 醉心369
手机看帖
扫描二维码
随时随地手机跟帖
21
醉心369|  楼主 | 2013-1-27 21:29 | 只看该作者 回帖奖励 |倒序浏览
在多大频率下需要考虑总线等长的问题

使用特权

评论回复
22
zjping0815| | 2013-6-24 11:36 | 只看该作者
醉心369 发表于 2013-1-8 22:08
是,这个错了,是我疏忽了。
unsigned char SPI_Send(unsigned char data)
{

两个stc单片机IO口模拟SPI通讯实例不









使用特权

评论回复
评论
醉心369 2013-6-28 08:04 回复TA
你说的这句话没看明白什么意思 
23
zjping0815| | 2013-6-28 11:38 | 只看该作者
发送程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>

sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P3^3;//从发/主接 数据线
sbit SPI_Clock=P3^4;//时钟线
sbit SPI_CS=P3^5;//片选线

uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);
void SendByte(uchar TXD_Data);
void Delay4us(void);

void Ini_mcs51(void)
{
        //P1ASF = B0000_0000;
    P1M1  =B0000_0000;
    P1M0  =B0000_0000;//                      1---模拟(ADC)工作状态。
    P1    =B1111_1111;//P1   8bit LED显示数据总线 与 键盘数据输入 端口。
                  
    P2M1=B0000_0000;
    P2M0=B0000_0000;
    P2  =B1111_1111;

    P3M1=B0000_0000;
    P3M0=B0000_0000;
    P3  =B1111_1111;
    //-------------
    EA  =0;
    IT0 =0;
    IT1 =0;
    PX0 =0;
    PX1 =0;
    PT0 =0;
    PT1 =0;
    PS  =0;
    TMOD = 0x11;
    TH0 = 0xec;TL0 = 0x78;
    TR0 = 1;
    TR1 = 0;
    ES = 0;
    ET0 = 1;
    ET1 = 0;
    ET2 = 0;
    EX0 = 0;
    EX1 = 0;
    EA = 0;
}//---------------------------------------------------

void Delay4us(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void SendByte(uchar TXD_Data)
{
        uchar data i;
        SPI_CS=1;//片选线0
        SPI_Clock=1;//时钟置高
        Delay4us();
        for(i=0;i<8;i++)
        {
                SPI_Clock=0;//时钟置0
                SPI_CS=0;//片选线0
                Delay4us();
                //Delay4us();
                if(TXD_Data&0x80)SPI_MOS0=1; // 若要发送的数据最高位为1则发送位1
                else             SPI_MOS0=0; // 否则传送位0
                SPI_Clock=1;//时钟置高
                Delay4us();                                                                                                                                                                                                       
                TXD_Data=TXD_Data<<1;// 数据左移一位
        }
        SPI_CS=1;//片选线1
}

void main(void)
{
        Ini_mcs51();
        while(1)
        {
                TXD_Buffer[0]=0xaa;
                SendByte(TXD_Buffer[0]);
        }
}
接收程序
#include <C:\KeilC707\C51\INC\STC\STC89c5x.H>
//#include <C:\KeilC707\C51\INC\STC\STC12c5a60s2.H>
#include <c:\KeilC707\c51\inc\intrins.h>

sbit SPI_MOS0=P3^2;//主发/从接 数据线
sbit SPI_MOS1=P2^4;//从发/主接 数据线
sbit SPI_Clock=P3^3;//时钟线
sbit SPI_CS=P3^4;//片选线
sbit LED=P3^7;//LED段选

uchar data RXT_data;
//uchar idata TXD_Buffer[16];
uchar idata RXD_Buffer[16];
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void Ini_mcs51(void);

void ResdByte(void);

void Delay4us(void);

void Delay4us(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void Ini_mcs51(void)
{
        //P1ASF = B0000_0000;
    P1M1  =B0000_0000;
    P1M0  =B0000_0000;//                      1---模拟(ADC)工作状态。
    P1    =B1111_1111;//P1   8bit LED显示数据总线 与 键盘数据输入 端口。
                  
    P2M1=B0001_0000;
    P2M0=B0000_0000;
    P2  =B1111_1111;

    P3M1=B0000_0000;
    P3M0=B0000_0000;
    P3  =B1111_1111;
    //-------------
    EA  =0;
    IT0 =0;
    IT1 =0;
    PX0 =0;
    PX1 =0;
    PT0 =0;
    PT1 =0;
    PS  =0;
    TMOD = 0x11;
    TH0 = 0xec;TL0 = 0x78;
    TR0 = 1;
    TR1 = 0;
    ES = 0;
    ET0 = 1;
    ET1 = 0;
    ET2 = 0;
    EX0 = 0;
    EX1 = 0;
    EA = 0;
}//---------------------------------------------------
//uchar ResdByte(void)
void ResdByte(void)
{
        uchar data i;
        uchar result=0;
        //SPI_CS=1;//片选线0
        //SPI_Clock=1;//时钟置1
        //SPI_MOS0=1;
        //delayNOP();
        if((!SPI_CS)&&(!SPI_Clock))
        {
                for(i=0;i<8;i++)
                {
                        while(!SPI_Clock);
                        Delay4us();
                        if(SPI_MOS0&0x01)result=1;
                        else             result=0;
                        _nop_();_nop_();
                        Delay4us();
                        while(SPI_Clock);
                        RXT_data=result|(RXT_data>>1);       
                }
        }
        while(!SPI_CS);
        //return RXT_data;
}
void main(void)
{
        P1=0xff;
        RXD_Buffer[0]=0xff;
        RXT_data=0xff;
        Ini_mcs51();
        while(1)
        {
                LED=0;
                //RXD_Buffer[0]=ResdByte();
                //P1=RXD_Buffer[0];       
                ResdByte();
                P1=        RXT_data;
        }       
}
我这程序怎么不能通讯,
希望大虾门发表一下意见

使用特权

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

本版积分规则