单片机模拟SPI程序.docx

上传人:scccc 文档编号:12925761 上传时间:2021-12-07 格式:DOCX 页数:9 大小:15.28KB
返回 下载 相关 举报
单片机模拟SPI程序.docx_第1页
第1页 / 共9页
单片机模拟SPI程序.docx_第2页
第2页 / 共9页
单片机模拟SPI程序.docx_第3页
第3页 / 共9页
单片机模拟SPI程序.docx_第4页
第4页 / 共9页
单片机模拟SPI程序.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《单片机模拟SPI程序.docx》由会员分享,可在线阅读,更多相关《单片机模拟SPI程序.docx(9页珍藏版)》请在三一文库上搜索。

1、时钟相位(CPHA)和时钟极性(CPOL)的不同组合使得 SPI传输有了 4种方式如果CPOL =0 , SCK引脚在空闲状态保持低电平;如果CPOL =1 , SCK弓I脚在空闲状态保持高电平时序图如下:CPHA =15 ;:CPOL = 0fJ |=_l_l. 用 or 16 b Ks (kpenllng on Dap France Form aft ($ee SPI CR1| 11 :!:''!:CPHA=0 e Lr|_rLnjw_r|_n cP。*。_n rLTLj'LpLpLrLL Mg :<from master)or 16 bits dependi

2、ng on Dta Frame Foimati(see SPICRIJ ;MOSI "Mt )TTK ; 厂心 1; 丫明充燧一(irorri slave)i jo r(一)AVR单片机实现代码/IO端口定义#define SPI_SCK PC0#define SPI_MOSI PC1#define SPI_MISO PC2#define SPI_DDR DDRC#define SPI_PORT PROTC#define SPI_PIN PINC/端口操作符定义#define SCK_SET SPI_PORT|=_BV(SPI_SCK)#define SCK_CLR SPI_PORT

3、&=_BV(SPI-SCK) #define MOSI_SET SPI_PORT|=_BV(SPI_MOSI)#define MOSI_CLR SPI_PORT&=_BV(SPI_MOSI)#define MISO_PIN PINC&_BV(SPI_MISO)#define DELAY_BUS如需要延时,用延时函数替代此符号/模式 1: CPOL=1 CPHA=1void spi_init(void)SCK_SET;SPI_DDR|=_BV(SPI_MOSI)|_BV(SPI_SCK);uint8_t spi_readwrite_byte(uint8_t data)ui

4、nt8_t i,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|=1;SCK_SET; /SCK产生上升沿data<<=1;DELAY_BUS;return ret;/模式 2: CPOL=0 CPHA=1void spi_init(void)SCK_CLR;SPI_DDR|=_BV(SPI_MOSI)|_BV(SPI_SCK);uint8_t s

5、pi_readwrite_byte(uint8_t data)(uint8_t i,ret=0;for(i=0;i<8;i+)(上升沿模拟if(data&0x80)/ 设置输出MOSI_SET;elseMOSI_CLR;SCK_SET;/SCK产生上升沿DELAY_BUS;下降沿模拟ret<<=1;if(MISO_PIN)/ 读数据ret|=1;SCK_CLR; /SCK产生下降沿 data<<=1;DELAY_BUS;return ret;/模式 3: CPOL=1 CPHA=0void spi_init(void)(SCK_SET;SPI_DDR|=_

6、BV(SPI_MOSI)|_BV(SPI_SCK);uint8_t spi_readwrite_byte(uint8_t data)(uint8_t i,ret=0;设置好输出口if(data&0x80)MOSI_SET;elseMOSI_CLR;for(i=0;i<8;i+)DELAY_BUS;/下降沿模拟ret<<=1;if(MISO_PIN)/ 读数据ret|=1;SCK_CRL;/SCK产生下降沿DELAY_BUS;/上升沿模拟data<<=1;if(data&0x80)/ 设置输出MOSI_SET;elseMOSI_CLR;SCK_SET

7、; /SCK产生上升沿return ret;/模式 4: CPOL=0 CPHA=0void spi_init(void)(SCK_CLR;SPI_DDR|=_BV(SPI_MOSI)|_BV(SPI_SCK);uint8_t spi_readwrite_byte(uint8_t data)(uint8_t i,ret=0;/设置好输出口if(data&0x80)MOSI_SET;elseMOSI_CLR;for(i=0;i<8;i+)(DELAY_BUS;/上升沿模拟ret<<=1;if(MISO_PIN)/ 读数据 ret|=1;SCK_SET;/SCK产生上升沿

8、DELAY_BUS;/下降沿模拟data<<=1;if(data&0x80)/ 设置输出MOSI_SET;elseMOSI_CLR;SCK_CLR; /SCK产生下降沿 return ret;(二)其它单片机实现代码#include "iom8535v.h”0DDRA|=0X01DDRA|=0X02DDRA&=0XFBDDRA|=0X08(X?(PORTA|=0X01):(PORTA&=0XFE)(X?(PORTA|=0X02):(PORTA&=0XFD)(X?(PORTA|=0X08):(PORTA&=0XF7)#define _

9、CPOL#define _CPHA#define SCK_IO#define MOSI_IO#define MISO_IO#define SSELIO #define SCK_D(X)#define MOSI_D(X)#define SSEL_D(X) #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 ;MOSIIO ;MISO_IO ;SSEL_IO ;S

10、SEL_D(1);MOSI_D(1);#if _CPOL=0SCK_D(0);#elseSCK_D(1);#endif/*模式零写数据*/#if _CPOL=0&&_CPHA=0/MODE 0 0void 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(v

11、oid)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/MODEvoid SPI_Send_Dat(unsigned char dat) (unsigned char n;for(n=0;n<8;n+)(SCK_D(1);if(dat&0x80)MOSI_D(1);els

12、e 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/MODEvoid SPI_Send_Dat(unsi

13、gned 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

14、_D(0);return dat;#endif/#if _CPOL=1&&_CPHA=1/MODE 1 1void 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);fo

15、r(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);/#endifwhile(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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1