📄 hotpower_nrf905.lst
字号:
124 #define TX_ADDRESS_0 TX_ADDRESS >> 24 //发送有效地址第1字节
125 #define TX_ADDRESS_1 (TX_ADDRESS >> 16) & 0xff //发送有效地址第2字节
126 #define TX_ADDRESS_2 (TX_ADDRESS >> 8) & 0xff //发送有效地址第3字节
127 #define TX_ADDRESS_3 TX_ADDRESS & 0xff //发送有效地址第4字节
128
129 /*-----------------------------------------------
130 nrf905命令控制字
131 ------------------------------------------------*/
132 #define WC 0x00 // Write configuration register command
133 #define RC 0x10 // Read configuration register command
134 #define WTP 0x20 // Write TX Payload command
135 #define RTP 0x21 // Read TX Payload command
136 #define WTA 0x22 // Write TX Address command
137 #define RTA 0x23 // Read TX Address command
138 #define RRP 0x24 // Read RX Payload command
139
140
141
142 void Config905(void) using 0//配置nRF905
143 {
144 1 CSN = 0; // Spi enable for write a spi command
*** ERROR C202 IN LINE 144 OF HOTPOWER_NRF905.C: 'CSN': undefined identifier
145 1 SpiReadWrite(WC); // Write config command
146 1 SpiReadWrite(CH_NO_BYTE); //中心频率低8位
147 1 SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
148 1 SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
149 1 SpiReadWrite(RX_PW_32BYTE); //接收数据宽度32字节
150 1 SpiReadWrite(TX_PW_32BYTE); //发送数据宽度32字节
151 1 SpiReadWrite(RX_ADDRESS_0); //接收有效地址第1字节
152 1 SpiReadWrite(RX_ADDRESS_1); //接收有效地址第2字节
153 1 SpiReadWrite(RX_ADDRESS_2); //接收有效地址第3字节
154 1 SpiReadWrite(RX_ADDRESS_3); //接收有效地址第4字节
155 1 SpiReadWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
156 1 CSN = 1; // Disable Spi
157 1 }
158
159 /*------------------------------------------------
160 SPI读写一体化函数SpiReadWrite()
C51 COMPILER V7.06 HOTPOWER_NRF905 03/28/2008 15:03:59 PAGE 4
161 入口参数:
162 val 写入命令或数据
163 出口参数:
164 R7 读出数据
165 ------------------------------------------------*/
166 unsigned char SpiReadWrite(unsigned char val) using 0
167 {
168 1 unsigned char i;
169 1 ACC = val;
170 1 for (i = 8; i > 0; i --)
171 1 {
172 2 CY = MISO;//取数据SO
173 2 _rlca_();//存数据ACC.0读数据ACC.7同时进行
174 2 MOSI = CY;//送数据SI
175 2 SCK = 1;//上升沿打入数据
176 2 _nop_();
177 2 SCK = 0;//下降沿读入数据(首次为假动作)
178 2 }
179 1 return ACC;
180 1 }
181
182
183 //******************************************************
184 //以下是maochao老师的SPI的Demo
185
186 #define SIZE 100
187 unsigned char SPI_rx_buff[SIZE];
188 unsigned char SPI_tx_buff[SIZE];
189 unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
190 unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok;
191
192 #pragma interrupt_handler spi_stc_isr:18
193 void spi_stc_isr(void)
194 {
195 1 SPI_rx_buff[rx_wr_index] = SPDR; //从ISP口读出收到的字节
196 1 SPI_ok = 1; // SPI 空闲
197 1 if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针
198 1 if (++rx_counter == SIZE)
199 1 {
200 2 rx_counter = 0;
201 2 rx_buffer_overflow = 1;
202 2 }
203 1 if (tx_counter) //如果发送缓冲区中有待发的数据
204 1 {
205 2 --tx_counter;
206 2 SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针
207 2 if (++tx_rd_index == SIZE) tx_rd_index = 0;
208 2 SPI_ok = 0; // SPI 发送工作
209 2 }
210 1 }
211
212 unsigned char getSPIchar(void)
213 {
214 1 unsigned char data;
215 1 while (rx_counter == 0); //无接收数据,等待
216 1 data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
217 1 if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针
218 1 CLI();
219 1 --rx_counter;
220 1 SEI();
221 1 return data;
222 1 }
C51 COMPILER V7.06 HOTPOWER_NRF905 03/28/2008 15:03:59 PAGE 5
223
224 void putSPIchar(char c)
225 {
226 1 while (tx_counter == SIZE);//发送缓冲区满,等待
227 1 CLI();
228 1 if (tx_counter || SPI_ok==0 ) //发送缓冲区已中有待发数据
229 1 { //或SPI正在发送数据时
230 2 SPI_tx_buffer[tx_wr_index] = c; //将数据放入发送缓冲区排队
231 2 if (++tx_wr_index == SIZE) tx_wr_index = 0; //调整指针
232 2 ++tx_counter;
233 2 }
234 1 else
235 1 {
236 2 SPDR = c; // 发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
237 2 SPI_ok = 0; // SPI 发送工作
238 2 }
239 1 SEI();
240 1 }
241
242 void spi_init(void)
243 {
244 1 unsigned chat temp;
245 1 DDRB |= 0x080; //MISO=input and MOSI,SCK,SS = output
246 1 PORTB |= 0x80; //MISO上拉电阻有效
247 1 SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
248 1 SPSR = 0x00;
249 1 temp = SPSR;
250 1 temp = SPDR; //清空SPI,和中断标志,使SPI空闲
251 1 SPI_ok = 1; // SPI 空闲
252 1 }
253
254 void main(void)
255 {
256 1 unsigned char I;
257 1 CLI(); //关中断
258 1 spi_init(); //初始化SPI接口
259 1 SEI(); //开中断
260 1 while()
261 1 {
262 2 putSPIchat(i); //发送一个字节
263 2 i++;
264 2 getSPIchar(); //接收一个字节(第一个字节为空字节)
265 2 ………
266 2 }
267 1 }
268
C51 COMPILATION COMPLETE. 0 WARNING(S), 19 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -