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

#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