单片机IO口模拟SPI四种模式的程序

2019-04-15 12:32发布

#include "iom8535v.h" #define _CPOL 1 #define _CPHA 0 #define SCK_IO DDRA|=0X01 #define MOSI_IO DDRA|=0X02 #define MISO_IO DDRA&=0XFB #define SSEL_IO DDRA|=0X08 #define SCK_D(X) (X?(PORTA|=0X01):(PORTA&=0XFE)) #define MOSI_D(X) (X?(PORTA|=0X02):(PORTA&=0XFD)) #define SSEL_D(X) (X?(PORTA|=0X08):(PORTA&=0XF7)) #define MISO_I() (PINA&0X04) void delay() { unsigned char m,n; for(n=0;n<5;n++); for(m=0;m<100;m++); } /************************************************ 端口方向配置 与输出初始化 ************************************************/ void SPI_Init(void) { SCK_IO ; MOSI_IO ; MISO_IO ; SSEL_IO ; SSEL_D(1); MOSI_D(1); #if _CPOL==0 SCK_D(0); #else SCK_D(1); #endif } /********************************************** 模式零 写数据 ***********************************************/ #if _CPOL==0&&_CPHA==0 //MODE 0 0 void SPI_Send_Dat(unsigned char dat) { unsigned char n; for(n=0;n<8;n++) { SCK_D(0); if(dat&0x80)MOSI_D(1); else MOSI_D(0); dat<<=1; SCK_D(1); } SCK_D(0); } /********************************************* 模式零 读数据 *********************************************/ unsigned char SPI_Receiver_Dat(void) { unsigned char n ,dat,bit_t; for(n=0;n<8;n++) { SCK_D(0); dat<<=1; if(MISO_I())dat|=0x01; else dat&=0xfe; SCK_D(1); } SCK_D(0); return dat; } #endif /********************************************** 模式二 写数据 ***********************************************/ #if _CPOL==1&&_CPHA==0 //MODE 1 0 void SPI_Send_Dat(unsigned char dat) { unsigned char n; for(n=0;n<8;n++) { SCK_D(1); if(dat&0x80)MOSI_D(1); else MOSI_D(0); dat<<=1; SCK_D(0); } SCK_D(1); } /********************************************* 模式二 读数据 *********************************************/ unsigned char SPI_Receiver_Dat(void) { unsigned char n ,dat,bit_t; for(n=0;n<8;n++) { SCK_D(1); dat<<=1; if(MISO_I())dat|=0x01; else dat&=0xfe; SCK_D(0); } SCK_D(1); return dat; } #endif /********************************************* 模式一 写数据 *********************************************/ #if _CPOL==0&&_CPHA==1 //MODE 0 1 void SPI_Send_Dat(unsigned char dat) { unsigned char n; SCK_D(0); for(n=0;n<8;n++) { SCK_D(1); if(dat&0x80)MOSI_D(1); else MOSI_D(0); dat<<=1; SCK_D(0); } } /********************************************* 模式一 读数据 *********************************************/ unsigned char SPI_Receiver_Dat(void) { unsigned char n ,dat,bit_t; for(n=0;n<8;n++) { SCK_D(1); dat<<=1; if(MISO_I())dat|=0x01; else dat&=0xfe; SCK_D(0); } SCK_D(0); return dat; } #endif /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// #if _CPOL==1&&_CPHA==1 //MODE 1 1 void SPI_Send_Dat(unsigned char dat) { unsigned char n; SCK_D(1); for(n=0;n<8;n++) { SCK_D(0); if(dat&0x80)MOSI_D(1); else MOSI_D(0); dat<<=1; SCK_D(1); } } /************************************ 模式三 读数据 ************************************/ unsigned char SPI_Receiver_Dat(void) { unsigned char n ,dat,bit_t; SCK_D(0); for(n=0;n<8;n++) { SCK_D(0); dat<<=1; if(MISO_I())dat|=0x01; else dat&=0xfe; SCK_D(1); } SCK_D(1); return dat; } #endif /************************************* *************************************/ void main() { SPI_Init(); DDRB = 0XFF; //#if _CPOL //SCK_D(0); //#endif while(1) { //SSEL_D(0); //SPI_Send_Dat(0x01); //SPI_Send_Dat(0x31); //SSEL_D(1); SSEL_D(0); SPI_Send_Dat(0x81); PORTB =SPI_Receiver_Dat(); SSEL_D(1); //delay(); } }