📄 spi.lst
字号:
C51 COMPILER V6.23a SPI 11/02/2007 08:49:05 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE SPI
OBJECT MODULE PLACED IN Spi.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe Spi.c DB OE
stmt level source
1
2 //*********************************************************
3 // 项 目: 通用控制器-V1.0
4 // 文件名: Spi.c
5 // 描 述: SPI收发程序
6 //*********************************************************
7
8 //===============================================
9 #include "main.h" //全部头文件
10 #include "spi.h" //头文件
11 #include "Uart0.h" //头文件
12 #include "Timer2.h" //头文件
13 //===============================================
14 /***************************************************/
15 UCHAR code TX_ADDRESS[TX_ADR_WIDTH] = {0x54,0x53,0x57,0x58,0x01}; //定义‘TSWX1' TX address
16 UCHAR xdata Ptr6_reg[40];
17 UCHAR xdata rx_buf[TX_PLOAD_WIDTH];
18 UCHAR xdata tx_buf[TX_PLOAD_WIDTH];
19 UCHAR flag;
20 UCHAR Ptr_Mode;
21 //***********************************************
22 // 变量定义
23 /**************************************************/
24 UCHAR bdata sta;
25 sbit RX_DR =sta^6;
26 sbit TX_DS =sta^5;
27 sbit MAX_RT =sta^4;
28
29 extern UCHAR data Sio_Lth;
30 extern UCHAR idata ComTBufHead;
31 extern UCHAR xdata ComTBuf[Com0TBuf_len];
32 //***********************************************
33 // 函数开始
34 //***********************************************
35 //初始化SPI
36 //-----------------------------------------------
37 void Init_Spi(void)
38
39 {
40 1 //BSY,MEN,CKPH,CKPL,SLV,NSS,SRMT,RXBMT
41 1 SPI0CFG = 0x40; // 0 1(主)0 0 0 0 0 0
42 1 //SPIF,WCOL,MODF,ROVER,NSS1,NSS0,TBMT,SPIEN
43 1 SPI0CN = 0x03; // 0 0 0 0 0 0 1 1
44 1
45 1 SPI0CKR = SYSCLK/2/1000000-1; //1MHz SPI时钟
46 1 }
47 //***********************************************
48 //无线模块初始化:-,M_RX,M_TX,M_RT,ECRC,CRC8,PWRUP,REV
49 // 0 0 0 0 1 0 1 1(收)
50 //收、发事件IRQ,CRC使能,上电,接收模式
51 //***********************************************
52 void Init_Ptr6(void) //
53
54 {
55 1 RX_Mode();
C51 COMPILER V6.23a SPI 11/02/2007 08:49:05 PAGE 2
56 1 Ptr_Mode = 0x0f;
57 1 //Tst_Ptr6(); //
58 1 }
59 //***********************************************
60 //无线模块中断:INT0 中断
61 //***********************************************
62 void PTR6_INT(void) interrupt 0 //INT0 中断
63
64 {
65 1 UCHAR kk,i;
66 1
67 1 kk=0;
68 1 sta=SPI_Read(STATUS); // read STATUS'
69 1
70 1 if(RX_DR) //
71 1
72 1 { //是接收中断从接收FIFO读接收包,置标志。
73 2 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//
74 2 flag=1;
75 2 //
76 2 kk = rx_buf[1];
77 2 for(i=0;i<kk;i++) //TX_LENTH=32
78 2 ComTBuf[i] = rx_buf[i]; //清SPI发送缓存
79 2 ComTBufHead=1;
80 2 Sio_Lth = ComTBuf[1];
81 2 SBUF0 = ComTBuf[0]; //启动串口发送
82 2 }
83 1
84 1 if(MAX_RT)
85 1 { //如果重发次数溢出,清发送FIFO
86 2 SPI_RW_Reg(FLUSH_TX,0);
87 2 }
88 1
89 1 // 清RX_DR/TX_DS/MAX_RT中断标志
90 1 SPI_RW_Reg(WRITE_REG+STATUS,sta);
91 1 kk= sta;
92 1 }
93
94 /**************************************************
95 功能描述: 写一字节到 nRF24L01的同时返回写期间
96 从nRF24L01读出的字节。
97 /**************************************************/
98 UCHAR SPI_RW(UCHAR byte)
99 {
100 1 SPI0DAT = byte;
101 1 while (SPIF == 0); //等待命令发送结束
102 1
103 1 byte = SPI0DAT; //读无效输入
104 1 SPIF = 0;
105 1 return(byte); // return read byte
106 1 }
107 //***********************************************
108 //读PTR6000 寄存器:读reg指定的寄存器,值在reg_val
109 //***********************************************
110 UCHAR SPI_Read(UCHAR reg)
111 {
112 1 UCHAR reg_val;
113 1
114 1 CSN = 0; // 使能
115 1 SPI_RW(reg); // 读命令
116 1 reg_val = SPI_RW(0); // 读数据
117 1 CSN = 1; // 禁止
C51 COMPILER V6.23a SPI 11/02/2007 08:49:05 PAGE 3
118 1
119 1 return(reg_val); // return register value
120 1 }
121 //***********************************************
122 //写value到reg寄存器
123 //***********************************************
124 UCHAR SPI_RW_Reg(UCHAR reg, UCHAR value)
125 {
126 1 UCHAR status;
127 1
128 1 CSN = 0; // CSN low, init SPI transaction
129 1 status = SPI_RW(reg); // select register
130 1 SPI_RW(value); // ..and write value to it..
131 1 CSN = 1; // CSN high again
132 1
133 1 return(status); // return nRF24L01 status byte
134 1 }
135 //***********************************************
136 //读reg指定位置bytes个数据字节到*pBuf
137 /**************************************************/
138
139 UCHAR SPI_Read_Buf(UCHAR reg, UCHAR *pBuf, UCHAR bytes)
140 {
141 1 UCHAR status,i;
142 1
143 1 CSN = 0; // Set CSN low, init SPI tranaction
144 1 status = SPI_RW(reg); // Select register to write to and read status byte
145 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -