单片机IO口模拟SPI四种模式的程序
生活随笔
收集整理的這篇文章主要介紹了
单片机IO口模拟SPI四种模式的程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2013年09月21日 10:00:02?zyboy2000?閱讀數:23924
?
#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(); } }總結
以上是生活随笔為你收集整理的单片机IO口模拟SPI四种模式的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NUC120 SPI 模拟I2S
- 下一篇: 智能卡7816协议