资源描述:
《单片机模拟SPI程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、时钟相位(CPHA)和时钟极性(CPOL)的不同组合使得SPI传输有了4种方式如果CPOL=0,SCK引脚在空闲状态保持低电平;如果CPOL=1,SCK引脚在空闲状态保持高电平时序图如下:(一)AVR单片机实现代码//IO端口定义#defineSPI_SCKPC0#defineSPI_MOSIPC1#defineSPI_MISOPC2#defineSPI_DDRDDRC#defineSPI_PORTPROTC#defineSPI_PINPINC//端口操作符定义#defineSCK_SETSPI_
2、PORT
3、=_BV(SPI_SCK)#defineSCK_CLRSPI_PORT&=~_BV(SPI-SCK)#defineMOSI_SETSPI_PORT
4、=_BV(SPI_MOSI)#defineMOSI_CLRSPI_PORT&=~_BV(SPI_MOSI)#defineMISO_PINPINC&_BV(SPI_MISO)#defineDELAY_BUS//如需要延时,用延时函数替代此符号//模式1:CPOL=1CPHA=1voidspi_init(void){SCK_SET;SPI_DDR
5、
6、=_BV(SPI_MOSI)
7、_BV(SPI_SCK);}uint8_tspi_readwrite_byte(uint8_tdata){uint8_ti,ret=0;for(i=0;i<8;i++){//下降沿模拟if(data&0x80)//设置输出MOSI_SET;elseMOSI_CLR;SCK_CRL;//SCK产生下降沿DELAY_BUS;//上升沿模拟ret<<=1;if(MISO_PIN)//读数据ret
8、=1;SCK_SET;//SCK产生上升沿data<<=1;DELAY_BU
9、S;}returnret;}//模式2:CPOL=0CPHA=1voidspi_init(void){SCK_CLR;SPI_DDR
10、=_BV(SPI_MOSI)
11、_BV(SPI_SCK);}uint8_tspi_readwrite_byte(uint8_tdata){uint8_ti,ret=0;for(i=0;i<8;i++){//上升沿模拟if(data&0x80)//设置输出MOSI_SET;elseMOSI_CLR;SCK_SET;//SCK产生上升沿DELAY_BUS;//下降沿模拟r
12、et<<=1;if(MISO_PIN)//读数据ret
13、=1;SCK_CLR;//SCK产生下降沿data<<=1;DELAY_BUS;}returnret;}//模式3:CPOL=1CPHA=0voidspi_init(void){SCK_SET;SPI_DDR
14、=_BV(SPI_MOSI)
15、_BV(SPI_SCK);}uint8_tspi_readwrite_byte(uint8_tdata){uint8_ti,ret=0;//设置好输出口if(data&0x80)MOSI_SET;elseM
16、OSI_CLR;for(i=0;i<8;i++){DELAY_BUS;//下降沿模拟ret<<=1;if(MISO_PIN)//读数据ret
17、=1;SCK_CRL;//SCK产生下降沿DELAY_BUS;//上升沿模拟data<<=1;if(data&0x80)//设置输出MOSI_SET;elseMOSI_CLR;SCK_SET;//SCK产生上升沿}returnret;}//模式4:CPOL=0CPHA=0voidspi_init(void){SCK_CLR;SPI_DDR
18、=_BV(SPI_
19、MOSI)
20、_BV(SPI_SCK);}uint8_tspi_readwrite_byte(uint8_tdata){uint8_ti,ret=0;//设置好输出口if(data&0x80)MOSI_SET;elseMOSI_CLR;for(i=0;i<8;i++){DELAY_BUS;//上升沿模拟ret<<=1;if(MISO_PIN)//读数据ret
21、=1;SCK_SET;//SCK产生上升沿DELAY_BUS;//下降沿模拟data<<=1;if(data&0x80)//设置输出MOSI_
22、SET;elseMOSI_CLR;SCK_CLR;//SCK产生下降沿}returnret;}(一)其它单片机实现代码#include"iom8535v.h"#define_CPOL1#define_CPHA0#defineSCK_IODDRA
23、=0X01#defineMOSI_IODDRA
24、=0X02#defineMISO_IODDRA&=0XFB#defineSSEL_IODDRA
25、=0X08#defineSCK_D(X)(X?(PORTA
26、=0X01):(PORTA&=0XF