我使用两 个 BOOSTXL-CC3135作为开发板、在5GHz 通道的收发器中实现无线电交换
初始化代码:
SL_DEBUG("start SimpleLink\n"); ret = sl_Start(NULL, comm_sl_ctx.spi_dev, NULL); SL_DEBUG("SL role %d\n", ret); if(ret == start_role){ printf("role is correct, waiting to acquiring ip ... \n"); if(start_role == ROLE_AP && (ret = comm_simplelink_wait_acqured_ip())){ SL_DEBUG("Error wait SimpleLink ipv4 aquired, ret %d\n", ret); break; } printf("\ndone\n"); }else if(ret != start_role){ printf("switching in %s mode\n", (start_role == ROLE_AP) ? "AP" : "STA"); if((ret = comm_simplelink_switch_mode(start_role)) != start_role){ SL_DEBUG("Error set SimpleLink role to AP, ret %d\n", ret); break; } } SL_DEBUG("get version\n"); pConfigLen = sizeof(ver); pConfigOpt = SL_DEVICE_GENERAL_VERSION; if((ret = sl_DeviceGet(SL_DEVICE_GENERAL, &pConfigOpt, &pConfigLen, (_u8 *)(&ver)))){ SL_DEBUG("Error get SimpleLink version info, ret %d\n", ret); break; } SL_DEBUG("\nCHIP %d, " "MAC 31.%d.%d.%d.%d, " "PHY %d.%d.%d.%d, " "NWP %d.%d.%d.%d, " "ROM %d, " "HOST %d.%d.%d.%d\n", ver.ChipId, ver.FwVersion[0], ver.FwVersion[1], ver.FwVersion[2], ver.FwVersion[3], ver.PhyVersion[0], ver.PhyVersion[1], ver.PhyVersion[2], ver.PhyVersion[3], ver.NwpVersion[0], ver.NwpVersion[1], ver.NwpVersion[2], ver.NwpVersion[3], ver.RomVersion, SL_MAJOR_VERSION_NUM, SL_MINOR_VERSION_NUM, SL_VERSION_NUM, SL_SUB_VERSION_NUM); SL_DEBUG("set enable 5G\n"); if((ret = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G, sizeof(enable), (_u8 *)&enable))){ SL_DEBUG("Error set SimpleLink 5G enable, ret %d\n", ret); break; } _u16 macAddressLen = sizeof(comm_sl_ctx.mac); _u16 ConfigOpt = 0; if((ret = sl_NetCfgGet(SL_NETCFG_MAC_ADDRESS_GET,&ConfigOpt,&macAddressLen,(_u8 *)comm_sl_ctx.mac))){ SL_DEBUG("Error get MAC addr, ret %d\n", ret); break; } SL_DEBUG("MAC addr %02X:%02X:%02X:%02X:%02X:%02X:\n", comm_sl_ctx.mac[0], comm_sl_ctx.mac[1], comm_sl_ctx.mac[2], comm_sl_ctx.mac[3], comm_sl_ctx.mac[4], comm_sl_ctx.mac[5]); SL_DEBUG("set device name\n"); if((ret = sl_NetAppSet(SL_NETAPP_DEVICE_ID, SL_NETAPP_DEVICE_URN, strlen(device_name), device_name))){ SL_DEBUG("Error set SimpleLink name, ret %d\n", ret); break; } SL_DEBUG("set enable 5G\n"); if((ret = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G, sizeof(enable), (_u8 *)&enable))){ SL_DEBUG("Error set SimpleLink 5G enable, ret %d\n", ret); break; } SL_DEBUG("reset SimpleLink\n"); if((ret = comm_simplelink_reset()) != start_role){ SL_DEBUG("Error SimpleLink interface reset, ret %d\n", ret); break; } SL_DEBUG("opening raw socket for ch %d\n", ch); if((comm_sl_ctx.sl_raw_socket = sl_Socket(SL_AF_RF ,SL_SOCK_RAW, ch)) < 0){ SL_DEBUG("Error opening RAW socket %d\n", ret); break; } if(!(comm_sl_ctx.raw_tx_frame = (uint8_t *)malloc(SL_RAW_FRAME_TX_BUFF_SIZE))){ SL_DEBUG("Error allocating memory for raw tx frame\n"); ret = -ENOMEM; break; } if(!(comm_sl_ctx.raw_rx_frame = (uint8_t *)malloc(SL_RAW_FRAME_RX_BUFF_SIZE))){ SL_DEBUG("Error allocating memory for raw tx frame\n"); ret = -ENOMEM; break; }
接收帧的代码
do{ if((ret = sl_Recv(comm_sl_ctx.sl_raw_socket, comm_sl_ctx.raw_rx_frame, len, 0)) < 0){ SL_DEBUG("Error receiving frame %d\n", ret); break; } SL_DEBUG("receive packet with len %d: rate %d, ch %d, rssi %d, timestamp %d\n", ret, packet->ti_header.rate, packet->ti_header.channel, packet->ti_header.rssi, packet->ti_header.timestamp ); if(ret < sizeof(comm_sl_raw_rx_packet_t)){ SL_DEBUG("packet size less than expected\n"); continue; } if(memcmp(packet->mac_header.receiver_addr, comm_sl_ctx.mac, sizeof(comm_sl_ctx.mac)) && memcmp(packet->mac_header.receiver_addr, SL_BROADCAST_BSSID, sizeof(comm_sl_ctx.mac))){ //this packet not for us printf("skip packet\n"); continue; } }while(0);
发送数据的代码
#define SL_SEND_FRAME_OPT(ch) SL_WLAN_RAW_RF_TX_PARAMS(ch, SL_WLAN_RATE_1M, 0 ,SL_WLAN_LONG_PREAMBLE) comm_sl_raw_tx_packet_t *packet = (comm_sl_raw_tx_packet_t *)comm_sl_ctx.raw_tx_frame; memset(packet, 0, sizeof(*packet)); packet->mac_header.frame_control.proto_version = SL_TRANSCIVER_FRAME_PROTO; packet->mac_header.frame_control.type = SL_TRANSCIVER_FRAME_TYPE; packet->mac_header.frame_control.subtype = SL_TRANSCIVER_FRAME_SUBTYPE; packet->mac_header.frame_control.from_ds = 0; packet->mac_header.duration = SL_FRAME_DURATION; memcpy(packet->mac_header.transmitter_addr, comm_sl_ctx.mac, sizeof(packet->mac_header.transmitter_addr)); memcpy(packet->mac_header.receiver_addr, dst_mac, sizeof(packet->mac_header.receiver_addr)); memcpy(packet->mac_header.bssid_addr, bssid, sizeof(packet->mac_header.bssid_addr)); memcpy(comm_sl_ctx.raw_tx_frame + sizeof(*packet), data, to_send); ret = sl_Send(comm_sl_ctx.sl_raw_socket, comm_sl_ctx.raw_tx_frame, sizeof(*packet) + to_send, SL_SEND_FRAME_OPT(comm_sl_ctx.ch));
作为 发射器地址我使用当前 cc 模块的 Mac、对于 接收器地址和 BSSID_addr、我使用广播 MAC FF:FF:FF:FF:FF:FF:FF
此代码生成的标头如示例中的0x88、0x00、0x2C、0x00接收器、发送器、 BSSID Mack
对于通道1至13、即2、4 GHz 通道、此代码起作用正确;对于通道36、40和任何其他5GHz 子范围、我未接收到来自收发器的任何数据包 (但仍从其他 WiFi 设备接收部分来自空中的数据包)
我尝试使用
SL_DEBUG("set country code\n"); if((ret = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, strlen(CountryCode), CountryCode))){ SL_DEBUG("Error set SimpleLink country code, ret %d\n", ret); break; } SL_DEBUG("set channel\n"); if((ret = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_CHANNEL, sizeof(channel), &channel))){ SL_DEBUG("Error set SimpleLink channel, ret %d\n", ret); break; }
如果 countrycode ="US"、但这没有n`t Help (
我是否错过了配置/发送/接收中的内容?