完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
标签 > nrf2401
nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。
nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。nRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。
nRF2401(最新版本为nRF2401A,nRF2401AG为无铅工艺版本)是由Nordic公司出品的单芯片无线收发芯片,工作于2.4GHz~2.5GHz的全球免申请(ISM)频率。芯片包括一个完全集成的频率合成器,功率放大器,晶体振荡器和调制器。发射功率和工作频率等工作参数可以很容易的通过3线SPI端口完成。极低的电流消耗,在-5dBm的输出功率时仅为10.5mA,在接收模式时仅为18mA。掉电模式可以很容易的实现低功耗需求。
nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。nRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。
nRF2401(最新版本为nRF2401A,nRF2401AG为无铅工艺版本)是由Nordic公司出品的单芯片无线收发芯片,工作于2.4GHz~2.5GHz的全球免申请(ISM)频率。芯片包括一个完全集成的频率合成器,功率放大器,晶体振荡器和调制器。发射功率和工作频率等工作参数可以很容易的通过3线SPI端口完成。极低的电流消耗,在-5dBm的输出功率时仅为10.5mA,在接收模式时仅为18mA。掉电模式可以很容易的实现低功耗需求。
兼容性
nRF2401是nRF2401A的早期型号,nRF2401AG是无铅工艺型号。它们完全兼容,硬件可直接替换,代码也可相互使用。
芯片结构
nRF2401内置地址解码器、先入后出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器,功率放大器等功能模块,需要很少的外围元件,因此使用起来非常方便。QFN24引脚封装,外形尺寸只有5×5mm。
工作模式
nRF2401有工作模式有四种:收发模式、配置模式、空闲模式和关机模式。nRF2401的工作模式由PWR_UP 、CE、CS三个引脚决定。
收发模式
nRF2401的收发模式有ShockBurstTM收发模式和直接收发模式两种,收发模式由器件配置字决定,具体配置将在器件配置部分详细介绍。
ShockBurstTM收发模式ShockBurstTM收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入,但高速(1Mbps)发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射速率。与射频协议相关的所有高速信号处理都在片内进行,这种做法有三大好处:尽量节能;低的系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。nRF2401的ShockBurstTM技术同时也减小了整个系统的平均工作电流。在ShockBurstTM收发模式下,nRF2401自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,当发送过程完成后,数据准备好引脚通知微处理器数据发射完毕。
ShockBurstTM发射流程接口引脚为CE,CLK1,DATAA. 当微控制器有数据要发送时,其把CE置高,使nRF2401工作;B. 把接收机的地址和要发送的数据按时序送入nRF2401;C. 微控制器把CE置低,激发nRF2401进行ShockBurstTM发射;D. nRF2401的ShockBurstTM发射给射频前端供电;射频数据打包(加字头、CRC校验码);高速发射数据包;发射完成,nRF2401进入空闲状态。
ShockBurstTM接收流程接口引脚CE、DR1、CLK1和DATA(接收通道1)A. 配置本机地址和要接收的数据包大小;B. 进入接收状态,把CE置高;C. 200us后,nRF2401进入监视状态,等待数据包的到来;D. 当接收到正确的数据包(正确的地址和CRC校验码),nRF2401自动把字头、地址和CRC校验位移去;E. nRF2401通过把DR1(这个引脚一般引起微控制器中断)置高通知微控制器;F. 微控制器把数据从nRF2401移出;G. 所有数据移完,nRF2401把DR1置低,此时,如果CE为高,则等待下一个数据包,如果CE为低,开始其它工作流程。
直接收发模式在直接收发模式下,nRF2401如传统的射频收发器一样工作。直接发送模式接口引脚为CE、DATAA. 当微控制器有数据要发送时,把CE置高;B. nRF2401射频前端被激活;C. 所有的射频协议必须在微控制器程序中进行处理(包括字头、地址和CRC校验码)。
直接接收模式接口引脚为CE、CLK1和DATAA. 一旦nRF2401被配置为直接接收模式,DATA引脚将根据天线接收到的信号开始高低变化(由于噪声的存在);B. CLK1引脚也开始工作;C. 一旦接收到有效的字头,CLK1引脚和DATA引脚将协调工作,把射频数据包以其被发射时的数据从DATA引脚送给微控制器;D. 这头必须是8位;E. DR引脚没用上,所有的地址和CRC校验必须在微控制器内部进行。
配置模式在配置模式,15字节的配置字被送到nRF2401,这通过CS、CLK1和DATA三个引脚完成,具体的配置方法请参考本文的器件配置部分。
空闲模式nRF2401的空闲模式是为了减小平均工作电流而设计,其最大的优点是,实现节能的同时,缩短芯片的起动时间。在空闲模式下,部分片内晶振仍在工作,此时的工作电流跟外部晶振的频率有关,如外部晶振为4MHz时工作电流为12uA,外部晶振为16MHz时工作电流为32uA。在空闲模式下,配置字的内容保持在nRF2401片内。
关机模式在关机模式下,为了得到最小的工作电流,一般此时的工作电流小于1uA。关机模式下,配置字的内容也会被保持在nRF2401片内,这是该模式与断电状态最大的区别。
NRF2401+芯片的ACK带数据返回功能的理解和总结
NRF2401+芯片主要特点:
工作在2.4~2.5GHz频段;
无线数据传输率可达1~2MHz;
SPI接口速率0~8MHz;
125可选工作频道(可跳频);
工作电压1.9~3.6V;
增强型ShockBurst™模式;
当NRF2401+模块工作在增强型ShockBurst™模式时,可以使用自动应答和自动重发功能,当然这些都不具有诱惑力,最多提高了数据传输的效率和稳定性,数据传输依然是单方向的。增强型ShockBurst™模式下有一种ACK带数据返回的功能,这个功能很强大,不需要人为的在程序中切换接收和发送状态,只需要通过寄存器简单的配置,就可以实现数据的双向传输,对于平常的学习,尤其是利用上位机调试参数,非常方便。本文主要介绍这种模式的配置以及自己对过程的理解、总结和一些疑问。
一、SPI指令和一部分寄存器如下:
SPI指令:
部分寄存器:
二、增强型ShockBurst™模式下ACK带数据返回功能的配置过程解释:
1、关于ACK带数据返回功能需要的额外配置:
参考手册部分:
由手册可知,如果要使用ACK带数据返回功能,必须额外满足:
~使能动态数据长度,即接收和发送数据长度可变,详见主接收设备配置部分解释;
~主接收端将随ACK返回的数据利用W_ACK_PAYLOADAY指令放入发送缓冲区,详见后文;
~置位FEATURE寄存器中的位EN_ACK_PAY,使能ACK带数据返回功能;
~最大重发时间间隔的设置步进值为250us,设置为500us适用于0~32任意长度字节的负载数据;(感觉翻译很别扭,上面的英文意思倒是很清晰!!)
注:此程序配置中一个主发送设备,一个主接收设备,均使用通道0进行数据传输;
2、主发送设备的配置过程解析
//函数名 : void NRF_TX_Mode(void)
//功能 : 初始化NRF2401+模块为发送模式
//输入参数: 无
//返回参数: 无
void NRF_TX_Mode(void)
{
//CE拉低,配置寄存器
NRF_CE_LOW();
// 写TX节点地址(1)
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
// 写RX节点地址 (2)
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
// 使能通道0的自动应答(3)
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);
// 使能通道0的接收地址(4)
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
//设置自动重发间隔时间:500us最大自动重发次数:10次(5)
SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
// 设置RF频率,手册有详细解释(6)
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,50);
// 设置TX发射参数,0db增益,2Mbps,低噪声增益开启(7)
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);
//清除发送和接收缓冲区(8)
SPI_NRF_WriteReg(FLUSH_TX,0xff);
SPI_NRF_WriteReg(FLUSH_RX,0xff);
//IRQ收发完成中断开启,16位CRC,主发送(9)
SPI_NRF_WriteReg(NRF_WRITE_REG + CONFIG_NRF, 0x0e);
//Active命令(10)
SPI_NRF_RW(0x50);
SPI_NRF_RW(0x73);
//使能动态数据长度(11)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1c,0x01);
//使能ACK带数据返回功能(12)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1d,0x06);
//CE拉高,进入发送模式(13)
NRF_CE_HIGH();
}
程序解释:
(1)仅用于主发送设备,写主发送设备发送节点地址,地址通过软件设定,可通过操作寄存器SETUP_AW修改地址宽度(1~5字节),寄存器复位之后,默认地址宽度为5字节;
主发送设备的发送节点地址必须和主接收设备的接收节点地址一致,否则接收不到数据。
通道0和1有5个字节宽度;
通道2~5的高32位必须和通道1相同,低8位可以通过软件设置;
参考手册寄存器部分:
(2)写接收节点地址,只有通道0可以用来接收ACK信号或ACK+返回数据,此地址必须和主发送设备的发送节点地址相同,即和(1)的相同。
(3)通道0的自动应答,必须;
(4)使能通道0的接收地址,必须;
(5)最大重发间隔时间至少设置为500us,最大重发次数1~15;
参考手册:ARD=500µs will be long enough for any payload length.
(6)设置通信频率,取值为0~125,取值50,即NEF模块的射频频率为2.450GHz;
参考手册:
上文大概意思是:可以通过给寄存器RF_CH这个寄存器写入参数0~125,使得NRF模块射频通道的通信频率在2.400GHz~2.525GHz范围内,射频信道的频率分辨率为1MHz,为了防止信道发生重叠,不同信道之间的射频频率相差至少2MHz, 射频信道的频率由下列公式计算:
F = 2400 + rf_ch [MHz]
为了能够彼此通信,发射机和接收机的射频信道的频率必须相同,即寄存器RF_CH设置一致。
(7)设置发射参数,具体参考手册寄存器部分;
(8)清除发送和接收缓冲区,如果不进行清除,测试可用;
(9)配置中断和CRC校验等,CRC校验8位和16位均可;
(10)激活命令,用于激活R_RX_PL_WID、W_ACK_PAYLOAD 、W_TX_PAYLOAD_NOACK;
参考手册SPI指令部分:
从手册中可以看到,使用ACTIVE(0x50)指令并写入数据0x73可以激活R_RX_PL_WID、W_ACK_PAYLOAD 指令和W_TX_PAYLOAD_NOACK (存在于寄存器FEATURE)状态,使用 R_RX_PL_WID指令可以得到接收到的数据长度;W_ACK_PAYLOAD 指令仅用于主接收设备,存储将要和ACK一起返回的数据,PPP的取值范围为000~101,表示0~6六个数据通道,所以W_ACK_PAYLOAD 指令的取值范围为0xa8~0xad,分别表示0~6六个通道,具体使用在主接收部分讲解。
(11)操作寄存器DYNPD使能通道0的动态数据长度;
ACK带数据返回功能必须使用动态数据长度,详见静态和动态数据长度介绍部分。
(12)置位寄存器 FEATURE寄存器里的 EN_DPL 和 EN_ACK_PAY状态位;
从下面的参考手册可以得知,要想使能通道0的动态数据长度,还需要使能EN_DPL位;
置位 EN_ACK_PAY状态位的目的是使能ACK带数据返回功能。
参考手册寄存器部分:
(13)进入发送模式。
// 函数名 : void NRF_Tx_Dat(u8 *txbuf , u8 datlen)
// 功能 :发送数据
// 输入参数: txbuf(需要发送的数据包),datlen(数据长度)
// 返回参数: 无
void NRF_Tx_Dat(u8 *txbuf , u8 datlen)
{
// CE拉低,将数据写入缓冲区
NRF_CE_LOW();
// 写数据到TX BUF 最大32个字节 (14)
SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,datlen);
// CE为高,发送数据包(15)
NRF_CE_HIGH();
}
(14)使用W_TX_PAYLOAD指令将要发送的数据写入发送缓冲区;
(15)CE置高10us后,主发送设备开始发送数据;
// 函数名 : void Nrf_Check_Event(u8 *rxbuf)
// 功能 :接收ACK返回的数据,并清除相应中断标志位
// 输入参数: txbuf(需要发送的数据包),datlen(数据长度)
// 返回参数: 无
注:此函数在主程序中每隔2ms执行一次,检测是否接收到和ACK一起返回的数据
void Nrf_Check_Event(u8 *rxbuf)
{
//得到中断标志位(16)
u8 sta = SPI_NRF_ReadReg(NRF_READ_REG + STATUS);
if(sta & RX_DR)
{
//得到数据长度(17)
u8 rx_len = SPI_NRF_ReadReg(R_RX_PL_WID);
if(rx_len《33)
{
// 接收返回数据
SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,rx_len);
// 解析收到数据
Data_Receive_Anl(rxbuf,rx_len);
}
else
{
// 清空接收缓冲区
SPI_NRF_WriteReg(FLUSH_RX,0xff);
}
}
if(sta & TX_DS)
{
}
if(sta & MAX_RT)
{
if(sta & 0x01)
{
// 清空发送缓冲区
SPI_NRF_WriteReg(FLUSH_TX,0xff);
}
}
// 清除中断标志位(18)
SPI_NRF_WriteReg(NRF_WRITE_REG + STATUS, sta);
}
(16)初始化过程中使能了发送成功、接收成功、达到最大重发次数中断,此处目的是得到中断标志位,从而执行相应的操作;
(17)从上面的指令部分可以得知,利用R_RX_PL_WID指令可以得到接收到的数据的长度;
(18)中断标志位必须清除。
3、主接收设备的配置过程解析
//函数名 : void NRF_RX_Mode(void)
//功能 : 初始化NRF2401+模块为发送模式
//输入参数: 无
//返回参数: 无
void NRF_RX_Mode(void)
{
NRF_CE_LOW();
//写TX节点地址(1)
// SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
//写RX节点地址(2)
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
//使能通道0的自动应答(3)
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);
//使能通道0的接收地址(4)
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
//设置RF通信频率(5)
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,50);
//设置自动重发间隔时间:500us;最大自动重发次数:10次(6)
// SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
//选择通道0的有效数据宽度(静态数据长度需要配置,动态数据长度不需要配置)(7)
//SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
//设置RX发射参数,0db增益,2Mbps,低噪声增益开启(8)
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);
SPI_NRF_WriteReg(FLUSH_TX,0xff);
SPI_NRF_WriteReg(FLUSH_RX,0xff);
// IRQ收发完成中断开启,16位CRC,主接收(9)
SPI_NRF_WriteReg(NRF_WRITE_REG + CONFIG, 0x0f);
// ACTIVE (10)
SPI_NRF_RW(0x50);
SPI_NRF_RW(0x73);
//使能动态数据长度(11)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1c,0x01);
//使能ACK带数据返回功能 (12)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1d,0x06);
//CE拉高,进入接收模式(13)
NRF_CE_HIGH();
}
(1)寄存器TX_ADDR “ Used for a PTX device only”,即用于主发送设备,主接收设备配置这个寄存器不起作用;
(2)配置主接收设备的接收数据节点地址,必须和主发送设备的发送端节点数据地址相同,否则接收不到数据;
(3)使能通道0的自动应答,因为主发送设备通过通道0进行数据发送;
从手册中可以看到,如果使能ACK,则需要使能相应通道的自动应答;
参考手册部分:
(4)使能通道0的接收地址,目的是能接受数据;
(5)取值50,即NEF主接收模块的射频频率为2.450GHz;
主发送模块的射频频率必须和主接收模块的射频频率相同;
详见主发送部分介绍;
(6)设置”最大重发次数“和”自动重发延时“;
如手册所示,只应用于主发送端,主接收端不需要配置;
所谓“自动重发”是指,当发送端在特定的时间内没有接收到返回的ACK时,则重新发送刚才的数据,直到达到最大重发次数;
参考手册部分:
(7)配置接收数据长度;
只有静态数据长度模式下需要配置,动态数据长度模式下不需要配置;
参考手册部分:
通过手册可知,在增强型ShockBurst 模式下,传输数据长度(最大32字节)有静态和动态两种模式,所谓静态指每次发送的数据长度固定,所谓动态是指每次发送的数据可随意长度,但是在ACK带数据返回模式下,只能使用动态数据长度。
静态数据长度模式下,主接收端可通过配置RX_PW_P0寄存器,设置接收数据长度,接收数据长度必须和发送端发送的数据长度相等;
动态数据长度模式下,接收端(无论是主接收端还是主发送端处于接受模式时)可以使用用R_RX_PL_WID(0110 0000)指令得到接收数据长度;
为了使能动态数据长度模式,FEATURE寄存器中的EN_DPL位必须置位(无论主发送端还是主接收端),同时主发送端的寄存器DYNPD中的位DPL_P0必须置位,主接收端寄存器DYNPD中的位DPL_PX必须置位(用到哪个通道置位哪个通道)。
(8)参数配置,必须和主发送设备一致,详见手册;
(9)基本配置;
必须和主发送端设置一致;
(10)(11)(12)详见主发送端配置说明;
(13)CE置高130us后,主接收设备开始检测是否有数据需要接收;
//函数名 : void NRF_Tx_Dat_AP(u8 * tx_buf, u8 len)
//功能 : ACK带数据返回函数
//输入参数: tx_buf(发送数据包),len(数据长度)
//返回参数: 无
void NRF_Tx_Dat_AP(u8 * tx_buf, u8 len)
{
// CE拉低,将数据写入缓冲区
NRF_CE_LOW();
// 写数据到TX BUF 最大32个字节(14)
SPI_NRF_WriteBuf(0xa8, tx_buf, len);
// CE为高,发送数据包
NRF_CE_HIGH();
}
(14)ACK带数据返回时,使用W_ACK_PAYLOAD(10101PPP)指令存储将要返回的数据,PPP表示通道0~5,取值为001~101;如果同时有六个设备(主发送)与一个设备(主接收)进行通信,则0xac表示接收端此时使用的是第4通道带数据返回;
// 函数名 : u8 Nrf_Check_Event(u8 *rxbuf)
// 功能 :接收数据,并清除相应中断标志位
// 输入参数: txbuf(接收的数据包),datlen(数据长度)
// 返回参数: sta (中断标志位)
u8 Nrf_Check_Event(u8 *rxbuf)
{
u8 sta = 0;
sta = SPI_NRF_ReadReg(STATUS);
if(sta & RX_DR)//接收中断
{
//得到数据长度
u8 rx_len = SPI_NRF_ReadReg(R_RX_PL_WID);
//读取数据
SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,rx_len);
SPI_NRF_WriteReg(FLUSH_RX,NOP);
}
if(sta & TX_DS)
{
}
if(sta & MAX_RT)
{
if(sta & 0x01)
{
SPI_NRF_WriteReg(FLUSH_TX,0xff);
}
}
// 清除中断标志位
SPI_NRF_WriteReg(NRF_WRITE_REG + STATUS, sta);
return sta;
}
三、增强型ShockBurst™模式下多机通信:
这部分主要介绍一下多机通信,即一个主接收设备与六个主发送设备进行通信,当然大多数情况下,我们用不到这个,这部分的主要目的理解接收数据地址和发送数据地址之间的关系。
参考手册部分:
这部分主要提到多机通信的过程中,所有设备的如下设置要一致:
~CRC使能;
~CRC配置(8位或16位);
~接收数据地址宽度;
~RF_CH配置相同,即射频频率需要配置一致;
~无线数据传输速率;
~低噪声放大器增益;
置位寄存器EN_RXADDR相应位可以使能相应的数据通道,数据通道地址可以通过RX_ADDR_PX寄存器来进行配置;
参考手册部分:
编辑推荐厂商产品技术软件/工具OS/语言教程专题
电机控制 | DSP | 氮化镓 | 功率放大器 | ChatGPT | 自动驾驶 | TI | 瑞萨电子 |
BLDC | PLC | 碳化硅 | 二极管 | OpenAI | 元宇宙 | 安森美 | ADI |
无刷电机 | FOC | IGBT | 逆变器 | 文心一言 | 5G | 英飞凌 | 罗姆 |
直流电机 | PID | MOSFET | 传感器 | 人工智能 | 物联网 | NXP | 赛灵思 |
步进电机 | SPWM | 充电桩 | IPM | 机器视觉 | 无人机 | 三菱电机 | ST |
伺服电机 | SVPWM | 光伏发电 | UPS | AR | 智能电网 | 国民技术 | Microchip |
开关电源 | 步进电机 | 无线充电 | LabVIEW | EMC | PLC | OLED | 单片机 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 蓝牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太网 | 仿真器 | RISC | RAM | 寄存器 | GPU |
语音识别 | 万用表 | CPLD | 耦合 | 电路仿真 | 电容滤波 | 保护电路 | 看门狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 阈值电压 | UART | 机器学习 | TensorFlow |
Arduino | BeagleBone | 树莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 华秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS | harmonyos |