rx

Nuvoton M0518 之 Slave SPI通信注意事项

匿名 (未验证) 提交于 2019-12-03 00:03:02
使用0518芯片的SPI0中断来实现0518芯片模块作为Slave方,使用SPI0接口来接收打印“Master方”发送过来的一个字节数据。 1、SPI0中断处理以及初始化相关源码如下: uint32_t u32RecvData_spi = 0 ; // void SPI0_IRQHandler ( void ) { /* Check RX EMPTY flag */ while ( SPI_GET_RX_FIFO_EMPTY_FLAG ( SPI0 ) == 0 ) { /* Read RX FIFO */ u32RecvData_spi = SPI_READ_RX ( SPI0 ); printf ( "%X\n" , u32RecvData_spi ); } /* Check TX FULL flag and TX data count */ while (( SPI_GET_TX_FIFO_FULL_FLAG ( SPI0 ) == 0 )) { /* Write to TX FIFO */ SPI_WRITE_TX ( SPI0 , 0 ); //用0x00填满FIFO的TX缓存区。 } /* Check the RX FIFO time-out interrupt flag */ if ( SPI_GetIntFlag ( SPI0 , SPI_FIFO_TIMEOUT

修改网卡缓存,解决Linux 网卡丢包严重问题

匿名 (未验证) 提交于 2019-12-02 21:59:42
修改网卡缓存,解决Linux 网卡丢包严重问题 Linux 网卡丢包严重 生产中有一台linux设备并发比较大,droped包比较多,尤其是在跑游戏数据包的时候,存在严重的丢包现象,怀疑网卡性能不足,在更换设备前想能不有通过软件方法解决,通过网上一些资料显示,出现这种现象,也有可能是网卡buffer size 太小的原因,遂尝试更改buffer 大小解决,下面的设备运行了64天,丢包超过20多亿 找了一些国外的文章,可以通过ethtool来修改网卡的buffer size ,首先要网卡支持,我的服务器是是INTEL 的1000M网卡,我们看看ethtool说明 查看当前网卡的buffer size情况 ethtool -g eth0 Ring parameters for eth0: Pre-set maximums: RX: 4096RX Mini: 0 RX Jumbo: 0 TX: 4096 Current hardware settings: RX: 256 RX Mini: 0 RX Jumbo: 0 TX: 256 由于我的是rx包会有droped的情况我们用 ethtool -G eth0 rx 2048 同样对于eth1也是如此ethtool -G eth1 rx 2048 再看看修改过后的 ethtool -g eth0 Ring parameters for

docker 网络管理

爱⌒轻易说出口 提交于 2019-12-01 23:27:11
1 网络通信 容器与容器的交互   docker0 网桥, 相当于交换机, 不同容器的数据通信通过它交换,   vetchx 一段固定容器的虚拟网卡, 一段固定在docker0. 每个容器有一个 [root@izwz97j0sus9exlvpgweqpz ~]# ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:fd:b5:e3:6b txqueuelen 0 (Ethernet) RX packets 28766 bytes 14584874 (13.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 28408 bytes 6915699 (6.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.250 netmask 255.255.255.0 broadcast 192

STM32之串口DMA接收不定长数据

风流意气都作罢 提交于 2019-12-01 13:37:59
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问 DMA 传输将数据从一个地址空间复制到另外一个地址空间。CPU只需初始化DMA即可,传输动作本身是由 DMA 控制器来实现和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。这样的操作并没有让处理器参与处理,CPU可以干其他事情,当DMA传输完成的时候产生一个中断,告诉CPU我已经完成了,然后CPU知道了就可以去处理数据了,这样子提高了CPU的利用率,因为CPU是大脑,主要做数据运算的工作,而不是去搬运数据。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。 在STM32的DMA资源 STM32F1系列

RT-Thread中的串口DMA分析

丶灬走出姿态 提交于 2019-11-30 11:49:35
这里分析一下RT-Thread中串口DMA方式的实现,以供做新处理器串口支持时的参考。 背景 在如今的芯片性能和外设强大功能的情况下,串口不实现DMA/中断方式操作,我认为在实际项目中基本是不可接受的,但遗憾的是,rt-thread现有支持的实现中,基本上没有支持串口的DMA,文档也没有关于串口DMA支持相关的说明,这里以STM32实现为背景,梳理一下串口DMA的实现流程,以供新处理器实现时以作参考。 DMA接收准备 启用DMA接收,需要在打开设备的时候做一些处理,入口函数为rt_device_open()。主体实现是: rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag) { ...... result = device_init(dev); ...... result = device_open(dev, oflag); ...... } device_init()就是rt_serial_init()函数,其主要是调用configure()函数, static rt_err_t rt_serial_init(struct rt_device *dev) { ...... if (serial->ops->configure) result = serial->ops->configure(serial,

NRF24l01的多对一通信

元气小坏坏 提交于 2019-11-30 02:51:38
文章目录 前言 必看 NRF一对一通信 NRF多对一通信 总结 遇到的问题 前言 怎么说呢,今天又看了一天的nrf,很多东西看起来特别简单,但实际用起来,你会发现漏洞百出。根本不知从何下手。下来就分享一下我的经验。对你应该会有所帮助。以下是基于stm32实现的nrf无线通信。 必看 这篇博客不适合无基础的人来看,因为下面程序我只给出部分程序,所以没基础你可能看不懂程序配置的是什么。我主要分享的是多对一通信时不同通道寄存器的参数如何求取 NRF一对一通信 首先NRF一对一通信没得说很简单,而且出问题的几率很小。一对一通信我就不多讲了,给出主要配置收发的程序。 例(1)一对一通信,发送模式的主要配置 如果单做一对一通信建议就用通道p0吧。 //设置发送地址 const u8 TX_ADDRESS [ TX_ADR_WIDTH ] = { 0x34 , 0x43 , 0x10 , 0x10 , 0x01 } ; //地址可以随便修改(仅针对通道P0的地址) const u8 RX_ADDRESS [ RX_ADR_WIDTH ] = { 0x34 , 0x43 , 0x10 , 0x10 , 0x01 } ; //接收地址 /*******************************************************************/ //配置发送模式 void

NRF24L01的多对一通信

末鹿安然 提交于 2019-11-30 02:49:31
一、一对一通信 要弄懂NRF的多对一通信,我们先要清楚NRF的一对一通信的地址设置,为了解说通俗我们将NRF24L01之间的通信比作两个人写信交流:首先寄信方将信件寄给收信方,收信方收到信件之后回信给寄信方确认收到信件。(以上为NRF24L01一次通信的过程,即发送端T发送信息给接收端R的流程)要完成双方的信件互通,那么双方都要知道对方的地址。这对应着NRF24L01作为发送端T时要设置1、发送地址:TX_ADDR。2、应答信号地址:RX_ADDR_P0(通道0用来接收接收端R的应达信号)。而接收端R要设置接收地址:RX_ADDR_Px(x取值为0到5,一个NRF24L01有6个通道,每一个通道都能设置作为接收信号的通道) 以上三个地址都要设置为相同的值。因为A发送信息给B,B把A的发送地址作为目标地址发回一个应答信号ACK,所以发送地址=应答信号地址=接收地址。注意:只有发送端的通道0才能接收应答信号。 二、多对一通信 多对一通信是指多个NRF24L01无线传输模块对一个NRF24L01无线传输模块进行数据传输,NRF24L01之所以能够进行多对一通信是因为:一个NRF24L01具有6个通道,每一个通道都能够接收信息。 对于接收端R:我们将NRF24L01接收端R的6个数据通道的地址设置为不同的值, 注意: 接收端通道0 RP0和接收端通道1 RP1的地址能随意设置,但是Rp2

NRF24L01的通道1 频道40配置:

喜欢而已 提交于 2019-11-30 02:48:57
NRF24L01的通道1,频道40配置: 1、修改频道: //#define CHANAL 40 //频道选择 #define CHANAL 10 //频道选择 2、保证 接发收地址宽度一致 #defineTX_ADR_WIDTH 5 //发射地址宽度 #define RX_ADR_WIDTH 5 3、修改接发收函数 void NRF_RX_Mode(void) { NRF_CE_LOW(); // 修改为通道1 寄存器地址 //SPI_NRF_WriteBuf(NRF_WRITE_REG+ RX_ADDR_P0 ,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 SPI_NRF_WriteBuf(NRF_WRITE_REG+ RX_ADDR_P1 ,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 //SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x00); //使能通道0的自动应答 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x02); //使能通道1的自动应答 //修改后 0x01 改为0x02 //SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 SPI_NRF_WriteReg(NRF_WRITE

STM32驱动NRF24L01

烈酒焚心 提交于 2019-11-30 02:46:55
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。 1. 简介 NRF24L01是 nordic 的无线通信芯片,它具有以下特点: 1) 2.4G 全球开放的 ISM 频段(2.400 - 2.4835GHz),免许可证使用; 2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强; 3) 125 个可选的频道,满足多点通信和调频通信的需要; 4)内置 CRC 检错和点对多点的通信地址控制; 5)低工作电压(1.9~3.6V),待机模式下状态为 26uA;掉电模式下为 900nA; 6)可设置自动应答,确保数据可靠传输; 7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transaction handling ,可以实现点对点或是 1 对 6 的无线通信,速度可以达到 2M(bps),具有可选的内置包应答机制,极大的降低丢包率。 8)通过 SPI 总线与单片机进行交互,最大通信速率为10Mbps; 1.1 结构框图 如图右侧为六个控制和数据信号,分别为 CSN、 SCK、 MISO、 MOSI、 IRQ、 CE。 信号线 功能 CSN 芯片的片选线, CSN 为低电平芯片工作 SCK 芯片控制的时钟线(SPI 时钟)

STM32驱动NRF24L01一对多的通信---可变数据包宽度

蹲街弑〆低调 提交于 2019-11-30 02:46:35
既然是一对多可变payload宽度的通信,肯定是包含两个方面: (1)能进行一对多通信(同个频道下一般最多是一对六) (2)发送的数据包宽度是可变的 配置NRF24L01进行一对多通信,前提是一对一通信机制必须要清楚。 我个人的理解是这样的 PTX端需要配置的地址TX_ADDR和RX_ADDR PRX端需要配置的地址RX_ADDR 至于以上地址在这个机制中是怎么用的,为什么会相同,下面会解释。 进入正题 ShockBurst™下数据包格式: PTX端发送数据前,会先对数据进行打包。在这个数据包红色框中的就是PTX发射端的地址TX ADDR。当PRX接收到一包有效的数据时,它会解析这个数据包中的Address地址是否跟它自身RX_ADDR相同,如果是相同的,那它就认为这是个发给我的包,如果不相同呢,那肯定是发给别人的包,就会被丢弃。好的,发送和接收都搞明白了,还有应答信号(前提是使能了自动应答)。前面说了PRX会对比Address地址是否跟自身RX_ADDR相同,一旦对比成功,PRX会自动转换到发送模式并以这个地址作为发送地址发送应答信号。那么PTX是怎么接收这个应答信号的呢(前提是使能了自动应答),PTX在发送了一包数据后会自动转换为接收模式,等待接收PRX发过来的应答信号。那PTX是怎么知道需要接收哪个从机发送过来的应答信号呢,PTX端的RX_ADDR就起作用了