mbass51 发表于 2014-8-26 15:18:25

关于stc spi 的从机发射

用82g516做主机,15w408s做从机,用pc串口发出01,从机接收没有问题,主机接收就是永远也是不同,各位知道如何解决?


master use 82g516
#include "reg51.h"
typedef unsigned char BYTE;
sfrAUXR       =   0x8E;       //Auxiliary register

sfr SPSTAT      =   0x84;       //SPI status register82G516
sfr SPCTL       =   0x85;       //SPI control register 82G516
sfr SPDAT       =   0x86;       //SPI data register           82G516
#define SPIF      0x80      //SPSTAT.7
#define WCOL      0x40      //SPSTAT.6

#define SSIG      0x80      //SPCTL.7
#define SPEN      0x40      //SPCTL.6
#define DORD      0x20      //SPCTL.5
#define MSTR      0x10      //SPCTL.4
#define CPOL      0x08      //SPCTL.3
#define CPHA      0x04      //SPCTL.2
#define SPDHH       0x00      //CPU_CLK/4
#define SPDH      0x01      //CPU_CLK/16
#define SPDL      0x02      //CPU_CLK/64
#define SPDLL       0x03      //CPU_CLK/128
sbit SPISS      =   P1^3;       //SPI slave select, connect to slave' SS(P1.4) pin
void InitUart();
void InitSPI();
void SendUart(BYTE dat);      //send data to PC
BYTE RecvUart();                //receive data from PC
BYTE SPISwap(BYTE dat);         //swap SPI data between master and slave
///////////////////////////////////////////////////////////
void main()
{
    InitUart();               //initial UART
    InitSPI();                  //initial SPI
    while (1)
    {
      SendUart(SPISwap(RecvUart()));
    }
}
///////////////////////////////////////////////////////////
void InitUart()
{
        SCON = 0x50;   //8_bit data,mode_1   all 10_bit
    TMOD = 0x21;   //T1_mode_2 ,8bit auto_reload   T0_mode_1 ,16bit_timer
    PCON = 0x00;
    TH1 = TL1 = 0xFD;      //9600byte
    ES = 1;   //serial_port_open_interrupt
    TR1 = 1;
    TI =0;
}
///////////////////////////////////////////////////////////
void InitSPI()
{
    SPDAT = 0;                  //initial SPI data
    SPSTAT = SPIF | WCOL;       //clear SPI status
    SPCTL = SPEN | MSTR | SPDLL;   //master mode + spi_rate
}
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
    SBUF = dat;
    while (!TI);                //wait pre-data sent
    TI = 0;                     //clear TI flag
//      SBUF = dat;             //send current data
}
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
    while (!RI);                //wait receive complete
    RI = 0;                     //clear RI flag
    return SBUF;                //return receive data
}
///////////////////////////////////////////////////////////
BYTE SPISwap(BYTE dat)
{
    SPISS = 0;                  //pull low slave SS
    SPDAT = dat;                //trigger SPI send
    while (!(SPSTAT & 0x80));//SPIF));    //wait send complete
    SPSTAT = 0xC0;   //SPIF | WCOL;       //clear SPI status
    SPISS = 1;                  //push high slave SS
    return SPDAT;               //return received SPI data
}

slave use 15w408s
#include "reg51.h"             //
typedef unsigned char BYTE;
sfrAUXR       =   0x8E;       //Auxiliary register

sfr SPSTAT      =   0xCD;       //SPI status register15F__0x84
sfr SPCTL       =   0xCE;       //SPI control register 15F__0x85
sfr SPDAT       =   0xCF;       //SPI data register           15F__0x86
//sfr SPSTAT      =   0x84;       //SPI status register82G516__0x84
//sfr SPCTL       =   0x85;       //SPI control register 82G516__0x85
//sfr SPDAT       =   0x86;       //SPI data register       82G516__0x86

#define SPIF      0x80      //SPSTAT.7
#define WCOL      0x40      //SPSTAT.6

#define SSIG      0x80      //SPCTL.7
#define SPEN      0x40      //SPCTL.6
#define DORD      0x20      //SPCTL.5
#define MSTR      0x10      //SPCTL.4
#define CPOL      0x08      //SPCTL.3
#define CPHA      0x04      //SPCTL.2
#define SPDHH       0x00      //CPU_CLK/4
#define SPDH      0x01      //CPU_CLK/16
#define SPDL      0x02      //CPU_CLK/64
#define SPDLL       0x03      //CPU_CLK/128

void InitSPI();
BYTE SPISwap(BYTE dat);         //swap SPI data between master and slave

BYTE data COUNTER_DATA;
///////////////////////////////////////////////////////////
void main()
{
    InitSPI();                  //initial SPI
        COUNTER_DATA = 0;
    while (1)
    {
       P2 = ~SPISwap(0x22);   //         send previous SPI data to master)
           P0 = ~COUNTER_DATA++;
    }
}
///////////////////////////////////////////////////////////
void InitSPI()//SLAVE
{
    SPDAT = 0;                  //initial SPI data
    SPSTAT = SPIF | WCOL;       //clear SPI status
    SPCTL = SPEN;               //slave mode
}
///////////////////////////////////////////////////////////
BYTE SPISwap(BYTE dat)
{
    SPDAT = dat;                //trigger SPI send
    while (!(SPSTAT & 0x80));//SPIF));   //wait send complete
    SPSTAT = 0xC0;   //SPIF | WCOL;       //clear SPI status
    return SPDAT;               //return received SPI data
}

页: [1]
查看完整版本: 关于stc spi 的从机发射