×
单片机 > 单片机程序设计 > 详情

通过底层AVR方法实现SPI数据传输

发布时间:2021-11-15 发布时间:
|

主机端:


1 /*********************************

2 代码功能:通过底层AVR方法实现SPI数据传输(主机端)

3 创作时间:2016*10*17

4 使用资源:

5 更低阶的 aTmega(AVR) 库

6 SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器)

7 SPCR(SPI Control Register暂存寄存器)

8 7bit SPIE 片选使能,SPIE = 1;片选无效,SPIE = 0片选有效(主机无需片选)(单机通信也无需片选)

9 6bit SPE

10 5bit DORD

11 4bit MSTR

12 3bit CPOL 时钟极性,CPOL = 0(时钟空闲为低电平);CPOL = 1(时钟空闲为高电平)

13 2bit CPHA 相位极性,CPHA = 0(表示第一个边沿);CPHA = 1(表示第二个边沿);都是表示数据采样,数据有效的时刻。

14 1bit SPR1

15 0bit SPR0

16

17

18

19

20 SPCR(SPI Status Register 暂存寄存器)

21 SPDR(SPI Control Register数据的暂存器)

22

23 作者邮箱:jikexianfeng@outlook.com

24 ********************************/

25 #define SCK_PIN 13 //宏定义时钟端口

26 #define MISO_PIN 12 //宏定义主机输出线

27 #define MOSI_PIN 11 //宏定义从机输出线

28 #define SS_PIN 10 //片选

29 boolean SlaveDataFlag; //数据标志位

30

31 void MasterInit(void) //初始化SPI引脚设置

32 {

33 pinMode(SCK_PIN,OUTPUT); //SCK_PIN为输出模式,(主机模式)

34 pinMode(MOSI_PIN,OUTPUT); //初始化主机输出总线

35 pinMode(MISO_PIN,INPUT); //初始化从机输出总线

36 pinMode(SS_PIN,OUTPUT); //初始化片选引脚(主机高电平,从机低电平)

37 //启动SPI

38 SPCR = B00000000;

39 SPCR = (1<

40 }

41

42 byte ReadByte(void)

43 {

44 while(!(SPSR&(1<

45 return SPDR;

46 }

47

48 void WriteByte(byte value)

49 {

50 SPDR = value;

51 while(!(SPSR&(1<

52 return ;

53 }

54

55 void setup()

56 {

57 Serial.begin(115200);

58 MasterInit();

59 Serial.println("jikexianfeng@outlook.com");

60 digitalWrite(SS_PIN,HIGH);

61

62 SlaveDataFlag = true;

63 }

64

65 void loop()

66 {

67 byte rxData;

68 while(true)

69 {

70 if(SlaveDataFlag)

71 {

72 digitalWrite(SS_PIN,LOW);

73 WriteByte(17);

74 Serial.println("Done writing data...");

75 Serial.println("Reading data from slave ...");

76 rxData = ReadByte();

77 digitalWrite(SS_PIN,HIGH);

78 Serial.println("Dome Reading data ...");

79 Serial.print("From Slave :");

80 Serial.println(rxData,DEC);

81 SlaveDataFlag = false;

82 }

83 }

84 }


从机端:


1 /*********************************

2 代码功能:通过底层AVR方法实现SPI数据传输(主机端)

3 创作时间:2016*10*17

4 使用资源:

5 更低阶的 aTmega(AVR) 库

6 作者邮箱:jikexianfeng@outlook.com

7 ********************************/

8 #define SCK_PIN 13

9 #define MISO_PIN 12

10 #define MOSI_PIN 11

11 #define SS_PIN 10

12

13 void SlaveInit(void)

14 {

15 pinMode(SCK_PIN,INPUT);

16 pinMode(MISO_PIN,INPUT);

17 pinMode(MISO_PIN,OUTPUT);

18 pinMode(SS_PIN,INPUT);

19

20 SPCR = B00000000;

21 SPCR = (1<

22 }

23

24 byte ReadByte(void)

25 {

26 while(!(SPSR&(1<

27 return SPDR;

28 }

29

30 void writeByte(byte value)

31 {

32 SPDR = value;

33 while(!(SPSR&(1<

34 return ;

35 }

36

37 void setup()

38 {

39 Serial.begin(115200);

40 SlaveInit();

41 }

42

43 void loop()

44 {

45 if(digitalRead(SS_PIN) == LOW)

46 {

47 writeByte(19);

48 byte rxData;

49 rxData = ReadByte();

50 Serial.print("Command :");

51 Serial.println(rxData);

52 }

53 }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录