?? 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 + -