关于AVR的模拟SPI程序

头文件
1
#ifndef SOFTSPI_H_ 2 #define SOFTSPI_H_ 3 #include "Com.h" //包含延时等函数 4 #define SPI_PORT PORTB //端口号 5 #define SPI_DDR DDRB //输入输出控制 6 #define SPI_PIN PINB //逻辑电平读取 7 8 #define CS0_BIT 4 //片选位 9 #define CS1_BIT 5 //片选位 10 #define CS2_BIT 6 //片选位 11 #define CS3_BIT 7 //片选位 12 /*关片选*/ 13 #define CS_MODE0_Disable SPI_PORT|=(1<<CS0_BIT) 14 #define CS_MODE1_Disable SPI_PORT|=(1<<CS1_BIT) 15 #define CS_MODE2_Disable SPI_PORT|=(1<<CS2_BIT) 16 #define CS_MODE3_Disable SPI_PORT|=(1<<CS3_BIT) 17 /*开片选*/ 18 #define CS_MODE0_Select SPI_PORT&=(~(1<<CS0_BIT)) 19 #define CS_MODE1_Select SPI_PORT&=(~(1<<CS1_BIT)) 20 #define CS_MODE2_Select SPI_PORT&=(~(1<<CS2_BIT)) 21 #define CS_MODE3_Select SPI_PORT&=(~(1<<CS3_BIT)) 22 23 #define SCK_BIT 1 //时钟位 24 #define SI_BIT 2 //从机输入位 25 #define SO_BIT 3 //从机输出位 26 27 #define SCK_H SPI_PORT|=(1<<SCK_BIT) //时钟高电平 28 #define SCK_L SPI_PORT&=~(1<<SCK_BIT) //时钟低电平 29 #define SO ((SPI_PIN&(1<<SO_BIT))>>SO_BIT) 30 #define SI_H SPI_PORT|=(1<<SI_BIT) //从机输入高电平 31 #define SI_L SPI_PORT&=~(1<<SI_BIT)//从机输入低电平 32 /* 33 模式说明 34 0 CPOL =0 CPHA=0 35 1 CPOL =0 CPHA=1 36 2 CPOL =1 CPHA=0 37 3 CPOL =1 CPHA=1 38 */ 39 #define SPI_MODE 2 40 41 42 extern void SPI_delay(u8 flag); //脉冲宽度 43 extern void SPI_Init(); //初始化 44 extern u8 SPI_RW(u8 cDATA); //写入和输出 45 extern u8 SPI_Delay_flag; //脉冲宽度选择 46 47 #endif

 

 1 源文件
 2 #include "SoftSPI.h"
 3 u8 SPI_Delay_flag=0;
 4 void SPI_delay(u8 flag)
 5 {
 6     if (flag) delay_ms(1);
 7     else delay_us(10);
 8 }
 9 
10 void SPI_Init()
11 {
12     SPI_DDR|=(1<<SI_BIT)|(1<<SCK_BIT)|(1<<CS0_BIT)|(1<<CS1_BIT)|(1<<CS2_BIT)|(1<<CS3_BIT);
13     SPI_DDR&=~(1<<SO_BIT);
14     SPI_PORT=0XFF;
15     #if SPI_MODE<2
16     SCK_L;
17     #endif
18     #if SPI_MODE>1
19     SCK_H;
20     #endif
21 
22 }
23 
24 u8 SPI_RW(u8 cDATA)
25 {
26     #if SPI_MODE ==0
27     for (u8 i=0;i<8;i++)
28     {
29         if ((cDATA&0X80)==0X80) SI_H;
30         else  SI_L;
31         cDATA<<=1;
32         SCK_H;
33         SPI_delay(SPI_Delay_flag);
34         if(SO>0) cDATA|=1;
35         SCK_L;
36         SPI_delay(SPI_Delay_flag);
37         
38     }
39     #endif
40     #if SPI_MODE==1
41     for (u8 i=0;i<8;i++)
42     {
43         
44         SCK_H;
45         if ((cDATA&0X80)==0X80) SI_H;
46         else  SI_L;
47         cDATA<<=1;
48         SPI_delay(SPI_Delay_flag);
49         SCK_L;    
50         SPI_delay(SPI_Delay_flag);
51         if(SO>0) cDATA|=1;
52     }
53     #endif
54     #if SPI_MODE==2
55     for (u8 i=0;i<8;i++)
56     {
57         if ((cDATA&0X80)==0X80) SI_H;
58         else  SI_L;
59         cDATA<<=1;
60         SCK_L;SPI_delay(SPI_Delay_flag);
61         if(SO>0) cDATA|=1;
62         SCK_H;SPI_delay(SPI_Delay_flag);
63     }
64     #endif
65     #if SPI_MODE==3
66     for (u8 i=0;i<8;i++)
67     {
68         SCK_L;
69         SPI_delay(SPI_Delay_flag);
70         if ((cDATA&0X80)==0X80) SI_H;
71         else  SI_L;
72         cDATA<<=1;    
73         SCK_H;
74         SPI_delay(SPI_Delay_flag);
75         if(SO>0) cDATA|=1;
76     }
77     #endif
78     return cDATA;
79 }

 

转载于:https://www.cnblogs.com/xping2016/p/6070719.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值