標(biāo)題:
STC8A8K64S4A12單片機(jī)驅(qū)動(dòng)nRF24L01發(fā)送/接收/半雙工收發(fā)
[打印本頁(yè)]
作者:
michaelchain
時(shí)間:
2021-11-13 16:36
標(biāo)題:
STC8A8K64S4A12單片機(jī)驅(qū)動(dòng)nRF24L01發(fā)送/接收/半雙工收發(fā)
連線方式如代碼注釋所示. 基于STC12的nRF24L01代碼修改. 通過(guò)修改CURRENT_SCEN的值可以切換發(fā)送, 接收和發(fā)送接收半雙工方式
寄存器初始化方法使用python工具生成, 工具地址
https://github.com/IOsetting/stcmx
main.c
/*****************************************************************************/
/**
* \file spi_nrf24l01_tx.c
* \brief Example code of SPI driving NRF24L01 module in all scenarios
* \note Pin connection:
* P12(SS, Ignored) => CSN,
* P13(MOSI) => MOSI,
* P14(MISO) => MISO,
* P15(SPCLK) => CLK,
* P32(INT0) => IRQ,
* P37(IO) => CE,
*
* \version v0.1
* \ingroup example
* \remarks test-board: Minimum System; test-MCU: STC8A8K64S4A12
* In my test STC12 cannot achive the best performance of nRF24L01,
* you have to put 20~40ms delay betwen each sending, or error rate
* will increase dramatically.
******************************************************************************/
#include "stc8a.h"
#include "uart.h"
#include "nrf24l01.h"
#include "util.h"
#include "spi.h"
const NRF24_SCEN CURRENT_SCEN = NRF24_SCEN_HALF_DUPLEX;
extern uint8_t idata xbuf[NRF24_PLOAD_WIDTH + 1];
void clock_init()
{
// [ BAH,0,0x00]: 外設(shè)端口切換控制寄存器2,串口2/3/4,I2C,比較器
P_SW2 = 0x80;
// [FE01H,1,0x00]: 時(shí)鐘分頻寄存器,ISP可能寫(xiě)入預(yù)設(shè)值
CLKDIV = 0x00;
// [ 9FH,0,0x00]: IRC頻率調(diào)整寄存器, ISP可能寫(xiě)入預(yù)設(shè)值, 0x75:24MHz
IRTRIM = 0x75;
// [ 9EH,0,0x00]: IRC頻率微調(diào)寄存器, ISP可能寫(xiě)入預(yù)設(shè)值
LIRTRIM = 0x00;
// [ BAH,0,0x00]: 外設(shè)端口切換控制寄存器2,串口2/3/4,I2C,比較器
P_SW2 = 0x00;
}
void timer_init()
{
// [ D6H,0,0x00]: 定時(shí)器2高字節(jié)
T2H = 0xFF;
// [ D7H,0,0x00]: 定時(shí)器2低字節(jié)
T2L = 0xCB;
// [ 87H,0,0x30]: 電源控制寄存器
PCON = 0xB0;
// [ 8EH,0,0x01]: 輔助寄存器
AUXR = 0x15;
}
void uart_init()
{
// [ 98H,0,0x00]: 串口1控制寄存器
SCON = 0x50;
// [ 87H,0,0x30]: 電源控制寄存器
PCON = 0xB0;
// [ 8EH,0,0x01]: 輔助寄存器
AUXR = 0x15;
}
void spi_init()
{
// [ CEH,0,0x00]: SPI控制
SPCTL = 0xD0;
}
void int_init()
{
IT0 = 1; // 低電平觸發(fā)
EX0 = 1; // 使能INT0中斷
EA = 1; // 使能全局中斷
}
INTERRUPT(int0_isr, 0)
{
NRF24L01_handelIrqFlag(xbuf);
}
void main(void)
{
uint8_t sta;
uint8_t code tmp[] = {
0x1F, 0x80, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x21, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28,
0x31, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x38,
0x41, 0x12, 0x13, 0x14, 0x15, 0x16, 0x37, 0x48};
clock_init();
timer_init();
uart_init();
PrintString("UART Initialized\r\n");
spi_init();
PrintString("SPI Initialized\r\n");
while (NRF24L01_check() == 1)
{
PrintString("Check failed\r\n");
Delay1000ms();
}
PrintString("NRF24L01 Checked\r\n");
switch (CURRENT_SCEN)
{
case NRF24_SCEN_TX:
NRF24L01_init(NRF24_MODE_TX);
PrintString("NRF24L01 Initialized\r\n");
//int_init();
while (1)
{
if (NRF24L01_writeFast(tmp) == 0)
{
PrintChar('E');
}
else
{
PrintChar('.');
}
Delay30ms();
}
break;
case NRF24_SCEN_RX:
NRF24L01_init(NRF24_MODE_RX);
int_init();
while(1);
break;
case NRF24_SCEN_HALF_DUPLEX:
NRF24L01_init(NRF24_MODE_RX);
int_init();
while (1)
{
NRF24L01_tx(tmp);
Delay1000ms();
}
break;
default:
PrintString("Unknown scen\r\n");
break;
}
}
復(fù)制代碼
51hei.png
(7.05 KB, 下載次數(shù): 49)
下載附件
2021-11-13 16:55 上傳
完整Keil代碼下載:
stc8a8k64s4_test02.zip
(17 KB, 下載次數(shù): 28)
2021-11-13 16:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1