You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1041 lines
31 KiB
1041 lines
31 KiB
#include "asp_SI24R1m.h"
|
|
|
|
TS_2g4_ ts_2g4 =
|
|
{
|
|
|
|
0,0,0,////ts_task_init, ///TS_task task;
|
|
|
|
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a, ///u8 Rbuf[32];
|
|
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,
|
|
0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
|
|
0x0d,0x0a,
|
|
|
|
0x31,0x36,0x37,0x38,0x39,0x32,0x33,0x34,0x35,0x3a, ///u8 Rbuf[32];
|
|
0x46,0x47,0x48,0x49,0x41,0x42,0x43,0x44,0x45,0x4a,
|
|
0x61,0x65,0x66,0x67,0x62,0x63,0x64,0x68,0x69,0x6a,
|
|
0x0d,0x0a,
|
|
0,///u8 Tbuf_change;
|
|
0, ///U8 val;
|
|
0, ///U8 con; ///config
|
|
0, ///U8 sta;
|
|
0, ///U8 sta_show;
|
|
0, ///U8 fifo_sta;
|
|
0, ///U8 id;
|
|
0, ///U32 sendStamp;
|
|
0, ///U32 over;
|
|
0, ///U8 rx_en;
|
|
0, ///U8 rx_ch;///有接收数据的通道号
|
|
0, ///U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量
|
|
///
|
|
0, ///U8 ok;
|
|
0, ///U8 tx_en;
|
|
0 ///U8 rs_mode;///发送或接收的模式
|
|
/// U8 ackFlag;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#if 0
|
|
1:前导码
|
|
2: 地址
|
|
3: ---------------- 包控制字----------------------
|
|
|-数据包长度(6bit) PID(1bit) NO_ACK(1bit)-|
|
|
4: DDDDDDD负载数据(0-32Bytes)DDDD
|
|
5: CRC
|
|
|
|
|
|
比较别扭的地方:
|
|
|
|
发送的地址寄存器只有一个,但是接收的寄存器共分6个 P0实际上就是最常用的接收地址
|
|
|
|
总共三种模式:
|
|
|
|
模式一 没有ACK
|
|
没有ack , 也就是NO_ACK 子字段为1,
|
|
发射方:FEATURE/EN_DYN_ACK = 1;
|
|
W_TX_PAYLOAD_NOACK--> FIFO
|
|
|
|
模式二 单纯ack 发送
|
|
EN_AA设置自动回复
|
|
|
|
W_TX_PAYLOAD命令写TX FIFO
|
|
发送: 地址等于接收的P0
|
|
接收: ack返回给发送(发送地址等于发送端的接收地址P0)
|
|
|
|
发送端发送数据后,没有收到对应地址返回的ACK(在ARD时间内),则重新发送上一帧数据
|
|
ARC累加 重发次数达到最大后,产生MAX_RT 中断 (SETUP_RETR设置)
|
|
|
|
模式三 ACK带返回数据
|
|
|
|
发送:
|
|
接收: W_ACK_PAYLOA命令写TX FIFO 返回的数据
|
|
|
|
|
|
|
|
发送数据长度的问题:
|
|
3.1 动态PAYLOAD长度 FEATURE.EN_DPL 1bit DYNPD.DPL_P0-5 此时包控制字段中的前六位是发送的数据长度
|
|
R_RX_PL_WID命令读取数据长度
|
|
|
|
3.2 静态PAYLAOD长度
|
|
|
|
发送的数据长度应该一致,并且于接收方的RX_PW_PX寄存器值相同
|
|
/********************************************************
|
|
函数功能:L2_SI24R1_RX_Mode(PRIM_RX_SEND );
|
|
入口参数:无
|
|
返回 值:无
|
|
*********************************************************/
|
|
void L2_SI24R1_RX_Mode(U8 rev)
|
|
{
|
|
D_SI24_CE_OFF();
|
|
ts_2g4.con = L1_SI24R1_RReg(CONFIG);
|
|
if(PRIM_RX_SEND == rev)
|
|
{
|
|
BITN_1(ts_2g4.con,PRIM_RX); ///1:发射模式
|
|
}else
|
|
{
|
|
BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式
|
|
}
|
|
L1_SI24R1_WReg(CONFIG,ts_2g4.con);
|
|
L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位
|
|
D_SI24_CE_ON(); // 拉高CE启动接收设备
|
|
}
|
|
|
|
#endif
|
|
|
|
void L3_task_2g4_reg(void)
|
|
{
|
|
|
|
for(ts_2g4.id = 0;ts_2g4.id <= 0x1d; ts_2g4.id ++)
|
|
{
|
|
ts_2g4.tx_en = L1_SI24R1_RReg(ts_2g4.id);
|
|
L0_uart0_sendArray("reg(",4);
|
|
L0_uart0_uchex(ts_2g4.id );
|
|
L0_uart0_sendArray(") = ",4);
|
|
L0_uart0_uchex(ts_2g4.tx_en);
|
|
L0_uart0_uc(' ');
|
|
}
|
|
|
|
|
|
|
|
L1_SI24R1_RAddr(TX_ADDR,ts_2g4.Rbuf);
|
|
|
|
L0_uart0_sendArray("\r\nTX_ADDR = ",15);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[0]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[1]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[2]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[3]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[4]);
|
|
|
|
L1_SI24R1_RAddr(RX_ADDR_P0,ts_2g4.Rbuf);
|
|
|
|
L0_uart0_sendArray("\r\nRX_ADDR_P0 = ",15);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[0]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[1]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[2]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[3]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[4]);
|
|
L1_SI24R1_RAddr(RX_ADDR_P1,ts_2g4.Rbuf);
|
|
|
|
L0_uart0_sendArray("\r\nRX_ADDR_P1 = ",15);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[0]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[1]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[2]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[3]);
|
|
L0_uart0_uchex(ts_2g4.Rbuf[4]);
|
|
|
|
|
|
|
|
|
|
L0_uart0_0d0a();
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
void L2_SI24R1_RX_Mode2(U8 rev)
|
|
{
|
|
/// D_SI24_CE_OFF();
|
|
ts_2g4.con = L1_SI24R1_RReg(CONFIG);
|
|
|
|
BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式
|
|
|
|
L1_SI24R1_WReg(CONFIG,ts_2g4.con);
|
|
L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位
|
|
D_SI24_CE_ON(); // 拉高CE启动接收设备
|
|
}
|
|
|
|
TS_addr_2g4_ ts_addr_2g4={
|
|
0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 TX[5]; ///发送基地址
|
|
0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 RX_P0[5]; ///接收P0基地址
|
|
0xCC,0xa2,0xB3,0xC4, D_MSC_1V6_P1,///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址
|
|
///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分
|
|
D_MSC_1V6_P2,///P2 //P[0] //u8 P[4];
|
|
D_MSC_1V6_P3,///P3 //P[1]
|
|
D_MSC_1V6_P5,///P4 //P[2]
|
|
D_MSC_1V6_P5 ///P5 //P[3]
|
|
};
|
|
|
|
#else
|
|
TS_addr_2g4_ ts_addr_2g4={
|
|
D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 TX[5]; ///发送基地址
|
|
D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 RX_P0[5]; ///接收P0基地址
|
|
D_MSC_1V6_P1,0xC4,0xB3,0xa2,0xCC, ///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址
|
|
///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分
|
|
D_MSC_1V6_P2,///P2 //P[0] //u8 P[4];
|
|
D_MSC_1V6_P3,///P3 //P[1]
|
|
D_MSC_1V6_P4,///P4 //P[2]
|
|
D_MSC_1V6_P5 ///P5 //P[3]
|
|
};
|
|
|
|
|
|
#endif
|
|
#if 0
|
|
rev
|
|
reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 37
|
|
reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00
|
|
reg(0A) = 20 reg(0B) = 21 reg(0C) = 22 reg(0D) = 23 reg(0E) = 24
|
|
reg(0F) = 25 reg(10) = 20 reg(11) = 00 reg(12) = 00 reg(13) = 00
|
|
reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00
|
|
reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06
|
|
TX_ADDR =\020C4B3A2CC
|
|
RX_ADDR_P1 =\021C4B3A2CC
|
|
RX_ADDR_P0 =\020C4B3A2CC
|
|
|
|
#endif
|
|
///void *L2_SI24R1_init(TS_2g4_ *s);///()
|
|
|
|
void (*L3_task_2g4_handle)(TS_2g4_ *s);
|
|
|
|
void L2_SI24R1_init_config(void)
|
|
{
|
|
L1_SI24R1_Init();
|
|
L3_task_2g4_handle = L2_task_2g4_handle_NOACK;
|
|
}
|
|
/***********
|
|
|
|
|
|
// 地址宽度 5Bytes 默认
|
|
L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址
|
|
|
|
ts_2g4.Tbuf[0]=0xaa;
|
|
ts_2g4.Tbuf[1]++;
|
|
ts_2g4.Tbuf[2]++;
|
|
ts_2g4.Tbuf[3]++;
|
|
ts_2g4.Tbuf[4]++;
|
|
|
|
|
|
L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据
|
|
|
|
**********/
|
|
|
|
|
|
////L2_SI24R1_TRmode(PRIM_RX_SEND);
|
|
////L2_SI24R1_TRmode(PRIM_RX_REV);
|
|
|
|
void L2_SI24R1_TRmode(u8 mode)
|
|
{
|
|
if (PRIM_RX_SEND == mode)
|
|
{
|
|
BITN_0(ts_2g4.con,PRIM_RX);
|
|
}else
|
|
{
|
|
BITN_1(ts_2g4.con,PRIM_RX);
|
|
}
|
|
D_SI24_Register();
|
|
L1_SI24R1_WReg(CONFIG,ts_2g4.con);
|
|
//// D_SI24_Work();
|
|
}
|
|
|
|
////////最简单的接收和发送模式 无ACK
|
|
void L2_SI24R1_init_NOACK_slave(void)
|
|
{
|
|
L1_SI24R1_Init();
|
|
///step 1: addr
|
|
//// L1_SI24R1_WReg(SETUP_AW, B0000_0011); // 地址宽度 5Bytes 默认
|
|
L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址
|
|
L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同
|
|
L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0
|
|
|
|
///step 3: RF config
|
|
L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40
|
|
|
|
L1_SI24R1_WReg(RX_PW_P0, 32);
|
|
|
|
L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm
|
|
L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL);
|
|
L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。
|
|
|
|
ts_2g4.con = MASK_RX_DR_ON ///接收中断打开
|
|
|MASK_TX_DS_ON ///发射中断关闭,在ack模式下
|
|
|MASK_MAX_RT_ON
|
|
|EN_CRC_ON
|
|
|EN_CRC_2Byte
|
|
|PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式
|
|
|PRIM_RX_REV;
|
|
|
|
L1_SI24R1_WReg(CONFIG,ts_2g4.con);
|
|
|
|
L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位
|
|
D_SI24_Work();
|
|
/// L3_task_2g4_reg(); // 拉高CE启动接收设备
|
|
}
|
|
|
|
void L2_SI24R1_init_NOACK_master(void)
|
|
{
|
|
D_SI24_Register();
|
|
// 地址宽度 5Bytes 默认
|
|
L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址
|
|
|
|
L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同
|
|
L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0
|
|
|
|
|
|
L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL); ///使能动态负载长度
|
|
L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。
|
|
|
|
L1_SI24R1_WReg(SETUP_AW, B0000_0011); ///5 byte addr width
|
|
///step 3: RF config
|
|
L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40
|
|
L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm
|
|
|
|
ts_2g4.con = MASK_RX_DR_ON ///接收中断打开
|
|
|MASK_TX_DS_ON ///发射中断
|
|
|MASK_MAX_RT_ON
|
|
|EN_CRC_ON
|
|
|EN_CRC_2Byte
|
|
|PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式
|
|
|PRIM_RX_SEND;
|
|
|
|
L1_SI24R1_WReg(CONFIG,ts_2g4.con);
|
|
/// L3_task_2g4_reg();
|
|
/// D_SI24_Work(); // 拉高CE启动接收设备
|
|
}
|
|
|
|
void L3_SI24R1_init_NOACK_master(void)
|
|
{
|
|
L2_SI24R1_init_NOACK_master();
|
|
L2_SI24R1_TRmode(PRIM_RX_SEND);
|
|
}
|
|
|
|
|
|
void L2_task_2g4_init(void)
|
|
{
|
|
L1_task_init(&ts_2g4.task);
|
|
L3_task_s_go(ts_2g4,D_task_init);
|
|
L2_SI24R1_init_NOACK_slave();
|
|
L2_SI24R1_init_NOACK_master();
|
|
}
|
|
|
|
#define L0_uart0_sendstr(x) ;
|
|
///L3_task_2g4_handle_NOACK(&ts_2g4);
|
|
////目前使用的no ack 标准应用,发送和接收
|
|
void L2_task_2g4_handle_NOACK(TS_2g4_ *s)
|
|
{
|
|
TTSS_Task_init():
|
|
|
|
L0_uart0_sendstr(" 2g4:NOACK /r/n");
|
|
////打印reg寄存器的信息
|
|
L3_task_2g4_reg();
|
|
///D_SI24_CE_ON();
|
|
L2_task_exit();
|
|
TTSS_Task_step(D_task_2g4_send):
|
|
L0_uart0_sendstr("\r\n 2g4:send-");
|
|
D_SI24_Register();
|
|
|
|
L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式
|
|
ts_2g4.val = 8;
|
|
ts_2g4.Tbuf[0]='a';
|
|
ts_2g4.Tbuf[1]='b';
|
|
ts_2g4.Tbuf[2]='n';
|
|
ts_2g4.Tbuf[3]='m';
|
|
ts_2g4.Tbuf[4]='k';
|
|
ts_2g4.Tbuf[5]='3';
|
|
ts_2g4.Tbuf[6]='l';
|
|
ts_2g4.Tbuf[7]='q';
|
|
ts_2g4.Tbuf[8]='7';
|
|
|
|
|
|
|
|
L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据
|
|
TTSS_overtime_init(s->over,D_Tdelay_3s);
|
|
ts_2g4.ok = 0;
|
|
D_SI24_Work();
|
|
L2_task_go(D_task_2g4_send_over);
|
|
TTSS_Task_step(D_task_2g4_send_over):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
///();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,TX_DS))///发送完成
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
///L2_SI24R1_TRmode(PRIM_RX_REV);
|
|
L0_uart0_sendstr(" 2g4: ok\r\n");
|
|
///L0_uart0_uc('s');
|
|
ts_2g4.ok = D_SI24R1_SENDOK;
|
|
}else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
L0_uart0_uc('M');
|
|
ts_2g4.ok = D_SI24R1_MAX_RT;
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
ts_2g4.ok = D_SI24R1_ER;
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
}
|
|
L2_task_exit();
|
|
}else
|
|
{///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败
|
|
////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题
|
|
TTSS_overtime_get(s->over)
|
|
L0_uart0_uc('o');
|
|
ts_2g4.ok = D_SI24R1_TIMEOVER;
|
|
L2_task_exit();
|
|
TTSS_overtime_end
|
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
TTSS_Task_step(D_task_2g4_REV):
|
|
L0_uart0_sendstr(" 2g4:rec mode\r\n");
|
|
L2_task_go(D_task_2g4_REV_start);
|
|
|
|
TTSS_Task_step(D_task_2g4_REV_start):
|
|
L0_uart0_sendstr("\r\n 2g4:rec S");
|
|
//// L2_SI24R1_init_NOACK_slave();
|
|
// D_SI24_Register();
|
|
L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式
|
|
////TTSS_overtime_init(s->over,D_Tdelay_5s);
|
|
ts_2g4.ok = 0;
|
|
D_SI24_Work();
|
|
L2_task_go(D_task_2g4_listen);
|
|
TTSS_Task_step(D_task_2g4_listen):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
D_SI24_Register();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据
|
|
{
|
|
ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID);
|
|
L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据
|
|
L1_SI24R1_WReg(FLUSH_RX,0xff);
|
|
ts_2g4.ok = D_SI24R1_RX_DR;
|
|
/// L2_task_go(D_task_2g4_rev_what);
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
L2_task_go(D_task_2g4_REV);
|
|
}
|
|
}else
|
|
{////侦听的过程中,每1s打印信息
|
|
TTSS_AreUok(s->over,D_Tdelay_1s,'L');
|
|
}
|
|
TTSS_Task_end();
|
|
}
|
|
#undef L0_uart0_sendstr
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
|
|
///L3_task_2g4_handle_NOACK(&ts_2g4);
|
|
////目前使用的no ack 标准应用,发送和接收
|
|
void L2_task_2g4_handle_NOACK3333(TS_2g4_ *s)
|
|
{
|
|
TTSS_Task_init():
|
|
L3_SI24R1_init_NOACK_master();
|
|
L3_task_2g4_reg();
|
|
L2_SI24R1_TRmode(PRIM_RX_SEND);
|
|
L0_uart0_sendstr(" 2g4:NOACK /r/n");
|
|
////打印reg寄存器的信息
|
|
///D_SI24_CE_ON();
|
|
L2_task_exit();
|
|
TTSS_Task_step(D_task_2g4_send):
|
|
L0_uart0_sendstr("\r\n 2g4:send-");
|
|
D_SI24_Register();
|
|
L3_SI24R1_init_NOACK_master();
|
|
ts_2g4.val = 5;
|
|
L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式
|
|
ts_2g4.Tbuf[0]='a';
|
|
ts_2g4.Tbuf[1]='b';
|
|
ts_2g4.Tbuf[2]='n';
|
|
ts_2g4.Tbuf[3]='m';
|
|
ts_2g4.Tbuf[4]='k';
|
|
ts_2g4.Tbuf[5]='3';
|
|
ts_2g4.Tbuf[6]='l';
|
|
ts_2g4.Tbuf[7]='q';
|
|
ts_2g4.Tbuf[8]='7';
|
|
|
|
|
|
L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据
|
|
TTSS_overtime_init(s->over,D_Tdelay_3s);
|
|
ts_2g4.ok = 0;
|
|
D_SI24_Work();
|
|
L2_task_go(D_task_2g4_send_over);
|
|
TTSS_Task_step(D_task_2g4_send_over):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
///();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,TX_DS))///发送完成
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
///L2_SI24R1_TRmode(PRIM_RX_REV);
|
|
L0_uart0_sendstr(" 2g4: ok\r\n");
|
|
///L0_uart0_uc('s');
|
|
ts_2g4.ok = D_SI24R1_SENDOK;
|
|
}else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
L0_uart0_uc('M');
|
|
ts_2g4.ok = D_SI24R1_MAX_RT;
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
ts_2g4.ok = D_SI24R1_ER;
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
}
|
|
L2_task_exit();
|
|
}else
|
|
{///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败
|
|
////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题
|
|
TTSS_overtime_get(s->over)
|
|
L0_uart0_uc('o');
|
|
ts_2g4.ok = D_SI24R1_TIMEOVER;
|
|
L2_task_exit();
|
|
TTSS_overtime_end
|
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
TTSS_Task_step(D_task_2g4_REV):
|
|
L0_uart0_sendstr(" 2g4:rec mode\r\n");
|
|
L2_SI24R1_init_NOACK_slave();
|
|
|
|
L3_task_2g4_reg();
|
|
TTSS_Task_step(D_task_2g4_REV_start):
|
|
L0_uart0_sendstr("\r\n 2g4:rec S");
|
|
L2_SI24R1_init_NOACK_slave();
|
|
D_SI24_Register();
|
|
L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式
|
|
////TTSS_overtime_init(s->over,D_Tdelay_5s);
|
|
ts_2g4.ok = 0;
|
|
D_SI24_Work();
|
|
L2_task_go(D_task_2g4_listen);
|
|
TTSS_Task_step(D_task_2g4_listen):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
D_SI24_Register();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据
|
|
{
|
|
L0_uart0_sendstr("\r\n 2g4:ok");
|
|
ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID);
|
|
L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据
|
|
L1_SI24R1_WReg(FLUSH_RX,0xff);
|
|
ts_2g4.ok = D_SI24R1_RX_DR;
|
|
/// L2_task_go(D_task_2g4_rev_what);
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
L2_task_go(D_task_2g4_REV);
|
|
}
|
|
}else
|
|
{////侦听的过程中,每1s打印信息
|
|
TTSS_AreUok(s->over,D_Tdelay_1s,'L');
|
|
}
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
|
|
TTSS_Task_step(D_task_2g4_rev_what):
|
|
L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num);
|
|
L0_uart0_0d0a();
|
|
ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf;
|
|
L0_uart0_uc(' ');
|
|
L0_uart0_uc('R');
|
|
L0_uart0_uchex(ts_2g4.m->reg);
|
|
switch(ts_2g4.m->reg)
|
|
{
|
|
case 1:
|
|
|
|
|
|
break;
|
|
default:
|
|
|
|
break;
|
|
|
|
};
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_Task_step(D_task_2g4_send_next):
|
|
////L2_SI24R1_TRmode(PRIM_RX_SEND);
|
|
L2_task_go(D_task_2g4_send);
|
|
|
|
///L2_task_go(D_task_2g4_send);
|
|
///L2_task_go(D_task_2g4_send);
|
|
///TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟
|
|
// L2_task_exit();
|
|
// L2_task_exit();
|
|
else
|
|
{///没有在闹钟规定的时间收到数据
|
|
TTSS_overtime_get(s->over)
|
|
L0_uart0_uc('e');
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_overtime_end
|
|
}
|
|
|
|
///L3_task_2g4_handle(&ts_2g4);
|
|
////目前使用的no ack
|
|
void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s)
|
|
{
|
|
TTSS_Task_init():
|
|
L2_SI24R1_init_NOACK_master();
|
|
L0_uart0_sendArray("master /r/n",9);
|
|
////打印reg寄存器的信息
|
|
L3_task_2g4_reg();
|
|
///D_SI24_CE_ON();
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_Task_step(D_task_2g4_send):
|
|
if(ts_2g4.sta_show)
|
|
{ts_2g4.sta_show = 0;
|
|
L0_uart0_sendArray("send --\r\n",9);
|
|
D_SI24_Register();
|
|
L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据
|
|
L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式
|
|
TTSS_overtime_init(s->over,D_Tdelay_5s);
|
|
L2_task_go(D_task_2g4_send_over);
|
|
}
|
|
TTSS_Task_step(D_task_2g4_send_over):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
D_SI24_Register();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,TX_DS))///发送完成
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
L2_SI24R1_TRmode(PRIM_RX_REV);
|
|
L0_uart0_uc('s');
|
|
TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟
|
|
///delay 130us
|
|
L2_task_go(D_task_2g4_ack);
|
|
}else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
L0_uart0_uc('M');
|
|
L2_task_go(D_task_2g4_send);
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
L2_task_go(D_task_2g4_send);
|
|
}
|
|
}else
|
|
{///发送闹钟如果溢出,说明发送失败
|
|
TTSS_overtime_get(s->over)
|
|
L0_uart0_uc('o');
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_overtime_end
|
|
}
|
|
TTSS_Task_step(D_task_2g4_ack):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
D_SI24_Register();
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据
|
|
{
|
|
ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID);
|
|
L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据
|
|
L1_SI24R1_WReg(FLUSH_RX,0xff);
|
|
L2_task_go(D_task_2g4_ack_what);
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff);
|
|
L2_task_go(D_task_2g4_send);
|
|
}
|
|
}else
|
|
{///没有在闹钟规定的时间收到数据
|
|
TTSS_overtime_get(s->over)
|
|
L0_uart0_uc('e');
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_overtime_end
|
|
}
|
|
TTSS_Task_step(D_task_2g4_ack_what):
|
|
L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num);
|
|
L0_uart0_0d0a();
|
|
ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf;
|
|
L0_uart0_uc(' ');
|
|
L0_uart0_uc('R');
|
|
L0_uart0_uchex(ts_2g4.m->reg);
|
|
switch(ts_2g4.m->reg)
|
|
{
|
|
case 1:
|
|
|
|
|
|
break;
|
|
default:
|
|
|
|
break;
|
|
|
|
};
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_Task_step(D_task_2g4_send_next):
|
|
////L2_SI24R1_TRmode(PRIM_RX_SEND);
|
|
L2_task_go(D_task_2g4_send);
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
/*****
|
|
|
|
|
|
///L1_SI24R1_TxData(WR_TX_PLOAD,ts_2g4.Tbuf,6);///需要发送的数据
|
|
L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据
|
|
|
|
///step 2: ch config
|
|
/// L1_SI24R1_WReg(FEATURE,EN_DPL| ///使能动态负载长度
|
|
/// EN_ACK_PAYd); ///使能ACK负载(带负载数据的ACK包)
|
|
|
|
|
|
/// L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。
|
|
/// L1_SI24R1_WReg(EN_AA, B0000_0001); ///使能数据管道0自动确认
|
|
L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0
|
|
|
|
|
|
//// L1_SI24R1_WReg(SETUP_RETR, B0011_0111); ///使能数据管道0-5
|
|
|
|
///step
|
|
*******/
|
|
|
|
/// L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位
|
|
|
|
///L0_uart0_uc('S');
|
|
///L0_uart0_uchex(ts_2g4.sta);
|
|
///L0_uart0_uc(' ');
|
|
/**L0_uart0_uc('C');
|
|
L0_uart0_uc(' ');
|
|
ts_2g4.sta = L1_SI24R1_RReg(FIFO_STATUS);
|
|
L0_uart0_uchex(ts_2g4.sta);
|
|
ts_2g4.sta = L1_SI24R1_RReg(OBSERVE_TX);
|
|
L0_uart0_uchex(ts_2g4.sta);
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
L0_uart0_uchex(ts_2g4.sta);
|
|
L0_uart0_uc(' ');
|
|
|
|
**/
|
|
|
|
void L3_task_2g4_handle_NOACK_slave(TS_2g4_ *s)
|
|
{
|
|
TTSS_Task_init():
|
|
L2_SI24R1_init_NOACK_slave();
|
|
L2_task_go(D_task_2g4_REV);
|
|
TTSS_Task_step(D_task_2g4_REV):
|
|
////打印reg寄存器的信息
|
|
/// L3_task_2g4_reg();
|
|
L0_uart0_sendArray("\r\nPRIM_RX_REV \r\n",17);
|
|
L2_task_go(D_task_2g4_ack);
|
|
TTSS_Task_step(D_task_2g4_ack):
|
|
if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断
|
|
{
|
|
ts_2g4.sta = L1_SI24R1_RReg(STATUS);
|
|
/// L0_uart0_uc('R');
|
|
// L0_uart0_uchex(ts_2g4.sta);
|
|
/// L0_uart0_uc(' ');
|
|
if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据
|
|
{
|
|
///ts_2g4.rx_ch = (ts_2g4.sta&B0000_1110)>>1;
|
|
/// ts_2g4.rx_fifo_num = L1_SI24R1_RReg(RX_PW_P0);///?读出的数据一直是
|
|
ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID);
|
|
/// L0_uart0_sendArray("\r\nR_RX_PL_WID =",15);
|
|
// L0_uart0_uchex(ts_2g4.rx_fifo_num);
|
|
/// L0_uart0_uc(' ');
|
|
L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据
|
|
L1_SI24R1_WReg(FLUSH_RX,0xff);
|
|
|
|
L2_task_go(D_task_2g4_ackPayload_UPDATE);
|
|
|
|
|
|
}else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK
|
|
{
|
|
L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器
|
|
L0_uart0_uc('M');
|
|
L2_task_go(D_task_2g4_ack);
|
|
}else
|
|
{
|
|
L0_uart0_uc('E');
|
|
L2_task_go(D_task_2g4_ack);
|
|
}
|
|
|
|
L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志
|
|
}
|
|
TTSS_Task_step(D_task_2g4_ackPayload_UPDATE):
|
|
L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num);
|
|
L0_uart0_0d0a();
|
|
TS_d32_
|
|
ts_2g4.Rbuf
|
|
|
|
L2_task_go(D_task_2g4_ack);
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
/*******************************************************
|
|
模式二:NOACK 通信
|
|
发射方配置:
|
|
spi_write_buf( TX_ADDR, TX_ADDRESS, 5); // 写入发送地址
|
|
spi_rw_reg( FEATURE, 0x01); // 使能 W_TX_PAYLOAD_NOACK 命令
|
|
spi_write_buf(W_TX_PAYLOAD_NOACK, buf, TX_PLOAD_WIDTH); // 写 FIFO
|
|
spi_rw_reg(SETUP_AW, 0x03); // 5 byte Address width
|
|
spi_rw_reg( RF_CH, 0x40); // 选择射频通道 0x40
|
|
spi_rw_reg(RF_SETUP, 0x08); // 数据传输率 2Mbps
|
|
spi_rw_reg( CONFIG, 0x0e); //配置为发射模式、CRC 为 2Bytes
|
|
CE = 1;
|
|
接收方配置:
|
|
spi_write_buf( RX_ADDR_P0, TX_ADDRESS, 5); // 接收地址
|
|
spi_rw_reg( EN_RXADDR, 0x01); // 使能接收通道 0
|
|
Preliminary Si24R1
|
|
spi_rw_reg( RF_CH, 0x40); // 选择射频信道
|
|
spi_rw_reg( RX_PW_P0, TX_PLOAD_WIDTH); //设置接收通道 0 负载数据宽度
|
|
spi_rw_reg( RF_SETUP, 0x08); // 数据传输率 2Mbps,-18dbm TX power
|
|
spi_rw_reg( CONFIG, 0x0f); // 配置为接收方、CRC 为 2Bytes
|
|
CE = 1;
|
|
|
|
|
|
*****************************************************/
|
|
|
|
/********************************************************
|
|
函数功能:读取接收数据
|
|
入口参数:rxbuf:接收数据存放首地址
|
|
返回 值:0:接收到数据
|
|
1:没有接收到数据
|
|
07
|
|
STATUS 状态寄存器(SPI操作开始,状态寄存器值通过
|
|
MISO串行输出)。
|
|
|
|
Reserved
|
|
7 -----------------------------------------
|
|
0 R/W 保留
|
|
|
|
RX_DR
|
|
6 ----------------------------------------
|
|
0 R/W RX FIFO有值标志位,写’1’清除。
|
|
|
|
TX_DS
|
|
5 ----------------------------------------
|
|
0 R/W 发射端发射完成中断位,如果是ACK模式,则收到
|
|
ACK确认信号后TX_DS位置1,写’1’清除。
|
|
|
|
MAX_RT
|
|
4 ----------------------------------------
|
|
0 R/W 达到最大重发次数中断位,写’1’清除。
|
|
|
|
RX_P_NO
|
|
3:1 ----------------------------------------------
|
|
111 R 收到数据的接收管道PPP号,可以通过SPI读出。
|
|
000-101:数据管道0-5
|
|
110:不可用
|
|
111:RX FIFO为空
|
|
|
|
TX_FULL
|
|
0 ----------------------------------------------
|
|
0 R
|
|
TX FIFO满标志位。
|
|
|
|
|
|
|
|
*********************************************************/
|
|
/*************************
|
|
|
|
void main2(void)
|
|
{
|
|
KEY1 = 1;
|
|
KEY2 = 1;
|
|
L1_SI24R1_Init();
|
|
L2_SI24R1_RX_Mode();
|
|
while(1)
|
|
{
|
|
u8 buf[32] = {0};
|
|
KEY1 = 1;
|
|
KEY2 = 1;
|
|
if(!KEY1 || !KEY2)
|
|
{
|
|
Lc_delay_ms(10);
|
|
if(!KEY1)
|
|
{
|
|
buf[0] = 0x55;
|
|
L2_SI24R1_TX_Mode();
|
|
L2_SI24R1_TxPacket(buf);
|
|
Lc_delay_ms(200);
|
|
}
|
|
if(!KEY2)
|
|
{
|
|
buf[0] = 0xAA;
|
|
L2_SI24R1_TX_Mode();
|
|
L2_SI24R1_TxPacket(buf);
|
|
Lc_delay_ms(200);
|
|
}
|
|
buf[0] = 0;
|
|
L2_SI24R1_RX_Mode();
|
|
}
|
|
|
|
if(!L2_SI24R1_RxPacket(buf))
|
|
{
|
|
switch(buf[0])
|
|
{
|
|
case 0x55:
|
|
LED3 = 0;
|
|
Lc_delay_ms(100);
|
|
LED3 = 1;
|
|
Lc_delay_ms(100);
|
|
break;
|
|
case 0xAA:
|
|
LED4 = 0;
|
|
Lc_delay_ms(100);
|
|
LED4 = 1;
|
|
Lc_delay_ms(100);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
buf[0] = 0;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
***************/
|
|
|
|
|
|
/********
|
|
|
|
L0_uart0_sendArray("\r\nS = ",6);
|
|
///while(9)
|
|
{
|
|
L0_uart0_uchex(0xaa);
|
|
L0_uart0_uchex(0x55);
|
|
}
|
|
L0_uart0_uchex(state);
|
|
Lc_delay_ms(600);
|
|
L0_uart0_0d0a();
|
|
|
|
第一次没有读取数据 把所有的寄存器给读取出来 然后对比
|
|
|
|
|
|
reg02 使能管道 01 管道1
|
|
reg00 b xxx10 关闭crc 1byte 开机 接收
|
|
b 1011 开启crc 1byte 开机 发送
|
|
rev
|
|
reg(00) = 02 reg(01) = 00 reg(02) = 01 reg(03) = 03 reg(04) = 03
|
|
reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00
|
|
reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5
|
|
reg(0F) = C6 reg(10) = E7 reg(11) = 20 reg(12) = 00 reg(13) = 00
|
|
reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00
|
|
reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01
|
|
send
|
|
reg(00) = 0B reg(01) = 00 reg(02) = 03 reg(03) = 03 reg(04) = 0A
|
|
reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00
|
|
reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5
|
|
reg(0F) = C6 reg(10) = 0A reg(11) = 00 reg(12) = 00 reg(13) = 00
|
|
reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00
|
|
reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01
|
|
|
|
.over
|
|
|
|
0a 39:0 E7E7E 7E7E7
|
|
E7 E7 E7 E7 E7
|
|
5X7 =35
|
|
|
|
....
|
|
reg(17) = 11
|
|
|
|
reg(10) = E7 TX_ADDRESS
|
|
reg(10) = 0A TX_ADDRESS
|
|
reg(17) = 01
|
|
|
|
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x0A,0x01,0x07,0x0E,0x01}; // 定义一个静态发送地址
|
|
|
|
|
|
**********/
|
|
|
|
#if 0
|
|
/********************************************************
|
|
函数功能:SI24R1接收模式初始化
|
|
入口参数:无
|
|
返回 值:无
|
|
*********************************************************/
|
|
void L2_SI24R1_RX_Mode(void)
|
|
{
|
|
CE = 0;
|
|
L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址
|
|
L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答
|
|
L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0
|
|
L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40
|
|
L1_SI24R1_WReg(RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度
|
|
L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm
|
|
L1_SI24R1_WReg(CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
|
|
L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位
|
|
CE = 1; // 拉高CE启动接收设备
|
|
}
|
|
|
|
|
|
/********************************************************
|
|
函数功能:SI24R1发送模式初始化
|
|
入口参数:无
|
|
返回 值:无
|
|
*********************************************************/
|
|
void L2_SI24R1_TX_Mode(void)
|
|
{
|
|
CE = 0;
|
|
L1_SI24R1_WBuf(TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
|
|
L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同
|
|
|
|
L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答
|
|
L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0
|
|
L1_SI24R1_WReg(SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次
|
|
L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40
|
|
L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm
|
|
L1_SI24R1_WReg(CONFIG, 0x0e); // CRC使能,16位CRC校验,上电
|
|
//CE = 1;
|
|
}
|
|
|
|
v3.2XF6420136C06938`-
|
|
sendmaster /r
|
|
reg(00) = 0F reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F
|
|
reg(07) = 0E reg(08) = 00 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3
|
|
reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00
|
|
reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00
|
|
reg(1C) = 3F reg(1D) = 06
|
|
|
|
.0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E abcdefg麻 over
|
|
|
|
v3.2XF642C5E203A72A`-
|
|
rev C 0F 11 0E S
|
|
reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F
|
|
reg(07) = 1E reg(08) = 13 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3
|
|
reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00
|
|
reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06
|
|
|
|
|
|
PRIM_RX_REV
|
|
.0E11130E .0E11130E
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|