#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