PRF: IO Pulse Transmitter¶
重要
此例程仅存在于特殊版本的SDK中,如有需要请联系Panchip。
1 功能概述¶
此项目演示了无线脉冲透传-发送端功能:通过IO口接收将外部的PWM波形,并通过2.4G传输给接收端设备。
发射端捕获上升沿和下降沿,在上升沿来到时,发个脉冲包,在下降沿来到时,再发个脉冲包。接收端(参考prf_io_pulse_rx)收到脉冲包后控制GPIO输出恢复原始脉冲。
系统框图:
2 环境要求¶
board: pan1080a_afld_evb
uart (option): 显示串口log
脉冲输出: PAN1020 EVB 或者 手动调整IO输入。
波形分析工具:逻辑分析仪或示波器。
需要搭配一个运行
prf_io_pulse_rx
的板子一起使用。
3 编译和烧录¶
项目位置:zephyr\samples_panchip\proprietary_radio\prf_io_pulse_tx
统一的配置、编译、下载工具正在开发中,当前可以使用脚本进行编译和下载。
脚本位置:quick_build_samples\proprietary_radio\prf_io_pulse_tx.bat
。
打开脚本后默认会编译项目,编译完成时,可输入字符进行后续下载等操作:
Input the keyword to continue:
'b' build 编译项目
'r' make clean and rebuild 重新编译项目
'f' flash download 下载
'e' erase chip 擦除芯片
'o' open project by VS Code 打开 `VS Code`,可查看源码,执行编译下载等
others exit 退出
wait input:
4 演示说明¶
将”samples_panchip\proprietary_radio\prf_io_pulse_tx\PAN1020_PWM.hex“通过j-link烧录到PAN1020 EVB板。
如果使用PAN1020 EVB作为脉冲产生器,需要一块PAN1020开发板,烧录
PAN1020_PWM.hex
。这个例程会有两个输出:PWM FREQ 50Hz: P2_3
PWM FREQ 1Hz: P2_4
PAN1080 EVB板发射端的GPIO捕获端口P2_3和PAN1020 EVB板输出端口连接P2_3或P2_4,同时将捕获端口接到逻辑分析仪或示波器上。
配置接收端(参考prf_io_pulse_rx)。
在逻辑分析仪上检查输出波形。
4.1 演示结果¶
PAN1020 PWM为50hz,占空比为50%,输出脉冲的宽度为10ms。发射端和接收端的波形如下:
发射端:
接收端:
发射端和接收端的脉冲宽度相差1us。
发射端和接收端的脉冲延迟220us。
PAN1020 PWM为1hz,占空比为1%,输出脉冲的宽度为10ms。发射端和接收端的波形如下:
发射端:
接收端:
发射端和接收端的脉冲宽度无误差。
发射端和接收端的脉冲延迟220us。
5 性能指标¶
支持带外传输:脉冲包通过私有2.4G传输,传输频点为2360~2510Mhz中的非标频点。
一个脉冲的长度,约10ms - 80ms,脉冲的频率1hz~50hz。还原脉冲的精度误差小于1us。从发射端捕获脉冲到接收端还原脉冲的延迟小于10ms。
为了确保传输过程中不丢包必须要用2.4G增强型模式,收发转换满足150us。
6 开发说明¶
发射端GPIO捕获上升沿和下降沿,上升沿和下降沿都会产生中断,每来一次中断发送一包2.4G数据。
6.1 GPIO初始化¶
static void callback_edge(const struct device *port, struct gpio_callback *cb,
gpio_port_pins_t pins)
{
panchip_prf_payload_t tx_payload = {
.data_length = 4,
.data = { 0x01, 0x02, 0x03, 0x04, },
};
if (pins == BIT(2)) {
}
if (pins == BIT(3)) {
panchip_prf_set_data(&tx_payload);
panchip_prf_trx_start();
}
}
void GPIO_Init(void)
{
const struct device *port;
port = device_get_binding(DT_LABEL(DT_NODELABEL(p2)));
gpio_pin_configure(port, 2, GPIO_INPUT);
gpio_pin_configure(port, 3, GPIO_INPUT);
gpio_init_callback(&gpio_cb, callback_edge, BIT(2) | BIT(3));
gpio_add_callback(port, &gpio_cb);
gpio_pin_interrupt_configure(port, 2, GPIO_INT_EDGE_BOTH);
gpio_pin_interrupt_configure(port, 3, GPIO_INT_EDGE_BOTH);
}
6.2 2.4G发射初始化¶
发射频点为带外频点2566Mhz:
pan_prf_config_t tx_config = {
.work_mode = PRF_MODE_NORMAL,
.chip_mode = PRF_CHIP_MODE_SEL_XN297,
.trx_mode = PRF_TX_MODE,
.phy = PRF_PHY_1M,
.crc = PRF_CRC_SEL_CRC8,
.src = PRF_SRC_SEL_NOSRC,
.rx_timeout = 50000,
.rf_channel = 2566,
.tx_no_ack = DISABLE,
.nrf52_mode = DISABLE,
.rx_length = 0,
.addr_length = 5,
.addr = { 0x11, 0x22, 0x33, 0x44, 0x55 },
};
2.4G初始化配置说明如下:
初始化配置的结构体“pan_prf_config_t”
Type |
name |
Description |
---|---|---|
prf_mode_t |
work_mode |
工作模式配置,包括普通型和增强型 |
prf_chip_mode_sel_t |
chip_mode |
xn297通信协议和nordic通信协议配置 |
prf_trx_mode_t |
trx_mode |
收发模式配置 |
prf_phy_t |
phy |
通信速率配置,可配置为1M和2M |
prf_crc_sel_t |
crc |
数据包CRC配置,可配置为crc 16bit,crc 8bit,no crc |
prf_scramble_sel_t |
src |
数据包扰码的配置,可配置为使用扰码和不使用扰码 |
uint16_t |
rx_timeout |
接收超时时间配置,最大50000us |
uint16_t |
rf_channel |
2.4g频点配置,配置范围2402-2480Mhz |
uint8_t |
tx_no_ack |
配置增强型模式下tx是否需要ack |
uint8_t |
nrf52_mode |
nordic的长包模式配置,最大payload的长度为255 |
uint8_t |
rx_length |
rx接收数据包长度配置,增强型模式下可不配置 |
uint8_t |
addr_length |
接入地址长度配置,可配置为3、4、5字节 |
uint8_t |
addr[5] |
接入地址的内容 |
prf_mode_t:
Type |
Value |
Description |
---|---|---|
PRF_MODE_NORMAL |
0 |
普通型 |
PRF_MODE_ENHANCE |
1 |
增强型 |
prf_chip_mode_sel_t:
Type |
Value |
Description |
---|---|---|
PRF_CHIP_MODE_SEL_BLE |
1 |
蓝牙模式 |
PRF_CHIP_MODE_SEL_XN297 |
2 |
XN297模式 |
PRF_CHIP_MODE_SEL_NORDIC |
3 |
NORCDIC模式 |
prf_trx_mode_t:
Type |
Value |
Description |
---|---|---|
PRF_TX_MODE |
0 |
2.4G发射 |
PRF_RX_MODE |
1 |
2.4G接收 |
prf_phy_t:
Type |
Value |
Description |
---|---|---|
PRF_PHY_1M |
1 |
1M通信速率 |
PRF_PHY_2M |
2 |
2M通信速率 |
prf_crc_sel_t:
Type |
Value |
Description |
---|---|---|
PRF_CRC_SEL_NOCRC |
0 |
no crc |
PRF_CRC_SEL_CRC8 |
1 |
crc 8bit |
PRF_CRC_SEL_CRC16 |
2 |
crc 16bit |
prf_scramble_sel_t:
Type |
Value |
Description |
---|---|---|
PRF_SRC_SEL_NOSRC |
0 |
不使能扰码 |
PRF_SRC_SEL_EN |
1 |
使能扰码 |
6.3 2.4G各中断处理¶
void event_tx_fun(void)
{
printk("tx done\n");
}
void event_rx_fun(void)
{
panchip_prf_payload_t rx_payload;
rx_payload.data_length = panchip_prf_data_rec(&rx_payload);
printk("rx data:");
data_printk(rx_payload.data, rx_payload.data_length);
}
void event_rx_timeout_fun(void)
{
printk("rx timeout\n");
}
void event_crc_err_fun(void)
{
printk("rx data crc err\n");
}
void event_pid_err_fun(void)
{
}
注:此例程对时间要求较高,因此在GPIO中断和LL中断中不宜添加打印或者执行时间长的代码。