Aguilera

  • 2019-04-21
  • 发表了主题帖: DP83822I工业以太网PHY自协商功能与其Strap电阻配置

    在工厂自动化应用中,由于现场设备节点数量与日俱增,同时对于自动化设备加工精度与实时性要求越来越高,传统的串行工业总线已经无法满足生产线同步性与大规模数据传输的要求。以太网逐渐成为主流,基于以太网全球主流OEM开发确定性网络工业以太网协议包括Profinet, Ethercat, Powerlink等。这些协议都需要以太网作为传输介质,以太网PHY主要负责。目前工业以太网总线速率以10/100M速率为主,下一代工业总线技术将会基于TSN(时间敏感网络)与速率1000M及以上的以太网协议。在进行以太网口功能调试过程中,最常见的问题是两个端口之前无法正确建立物理层链接。所以本文档的内容基于TI以太网PHY产品DP83822,介绍以太网网口自协商(Auto-Negotiation)功能现象,正确的测试波形与Strap电阻设置。 1.            介绍OSI模型定义了7层网络模型,以太网MAC层对应OSI模型中的第二层-数据链路层,以太网PHY对应OSI模型中的第一层-物理层。对于以太网而言,物理层的主要功能是将在网线或者光纤中传输的原始数据(电压,电流等)转化为可被接收且符合协议的数字信号,其为数据链路层提供物理连接。物理层主要规定了信号电压,频率,引脚功能,阻抗等。作为网络通讯的基础,只有在物理层成功建立链接后,通信数据才能在端口之间进行传输。以太网PHY承担了物理层链接的所有工作,只有PHY工作在正确配置下,通信链路才能正常工作。下面会以10M/100M以太网PHY为例,说明物理层链接建立方式 – 自动协商及如何检通过检测TRX_P/N管脚波形判断DP83822是否正确开启该功能。 2.            DP83822自动协商(Auto-Negotiation)功能根据IEEE802.3,自动协商模式功能是以太网端口根据另一个端口的设备链接速度,双工模式,自动把本端口的速度和工作模式调节到两个端口可以支持的最高水平。自协商协议的主要内容包括:双工模式,运行速率等。自动协商功能完全由物理层PHY芯片实现,无需额外数据包和高层协议开销。根据广播通信速率10M或者100M的不同,自动协商功能提供两种模式NLP(Figure 6)和FLP(Figure 2)。DP83822I(工业版本)支持10M – 10Base- TE模式和100M – 100Bast – TX模式10Base-TE自动协商模式(10M)使用单独10Base-TE广播自动协商模式时, PHY芯片会通过Figure 1中TXD_P, TXD_N和RXD_P,RXD_N发送NLP(Normal Link Pulse)普通链路脉冲,每个脉冲间隔16ms。为了同时兼容T568A直连网线和T568B交叉网线,所以在收发端同时广播NLP,根据对方对口的监听情况判断是否使用自动交叉线切换功能(Auto-MDIX)。100Base-TX自动协商模式(100M)使用100Bast-TX自动协商模式时, PHY芯片会通过Figure 1中TXD_P, TXD_N和RXD_P,RXD_N发送FLP(Fast Link Pulse)快速链路脉冲。由于100Base-TX自动协商模式由100Base-T向10Base-T兼容,如果对方端口只能支持10M以太网,则两侧都会判定为10Base-T。为了同时兼容T568A直连网线和T568B交叉网线,所以在收发端同时广播FLP,根据对方对口的监听情况判断是否使用自动交叉线切换功能(Auto-MDIX)。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173050.pngFigure 1 DP83822原理图 开启自动协商模式:TXD_P/N引脚波形测试使用DP83822I评估模块[1],默认电阻与寄存器配置,在无网线连接其他以太网端口的情况下。通过观测TXD_P引脚波形可以判断芯片是否在进行自动协商。当无其他端口与本端口连接时,自动模式下TXD_P/N引脚发送的FLP波形为Figure 2。TXD_P/N会持续发送FLP信号给远端以太网端口,同时TXD_P/N也会监听对端是否通过网线传输FLP信号。每帧FLP脉冲发送时间间隔16ms。直流共模电压3.3V,单端峰值电压5.2V。 https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173106.pngFigure 2 100base-TX自动协商 FLP信号如果对单帧脉冲周期进行放大可以观察到FLP信号包含多个脉冲信号。最大数量为33个脉冲,第一个脉冲和最后一个脉冲为时钟脉冲,每两个时钟脉冲之间为数据脉冲。当数据脉冲出现时,该比特位为’1’,当数据脉冲为0时,该比特位为’0’。双工模式,速率等信息就包含在16个数据脉冲之中,如Figure 3所示。 https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173522.pngFigure 3 100base-TX自动协商 单帧FLP信号如Figure 4所示,单个脉冲TXD_P和TXD_N幅值相同,相位相差180度差分信号。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173536.pngFigure 4 100base-TX自动协商 TXD_P/N差分信号(红色TXDP-TXDN) 峰值为3.3V 关闭自动协商模式:TXD_P/N引脚波形使用DP83822I评估板,在上电后使用工具[2]将0x0000(BMCR) BIT12更改为’0’,关闭自动协商模式。此时得到Figure 5,由图可知TXD_P不再发送FLP脉冲群,而是在持续发送MLT-3信号。发送MLT-3表示PHY认为此时已经进入强制100Base-TX, Figure 5表示以太网PHY工作在100Bast-TX的空闲状态。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173558.pngFigure 5 100Base-TX以太网特征信号(MTL-3电平)- 自动协商功能关闭 此时将0x0000(BMCR) BIT13设置为’0’,即将以太网速度从100M变为10M。此时TXD_P/N在持续发送NLP信号,因为10Base-TE 空闲模式与NLP信号相同。此时PHY进入强制10Base-TE模式。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173612.pngFigure 6 10Base-TE NLP - 自动协商功能关闭 从以上测试结果可以发现,通过示波器观察TXD_P/N引脚信号可以对以太网PHY(例如DP83822I)上电后的链接电路的模式和状态进行分类。在现在通用以太网PHY的设计中,通常建议开启自动协商模式支持最高速率与全双工模式(Auto-Negotiation),当在无远端以太网端口链接的情况下,应能在TXD_P/N引脚观侧到Figure 2和Figure 3波形。 自动协商模式Strap电阻配置DP83822I在上电完成之后,需要默认使能自动协商模式,且保证最快速率和全双工模式,最重要的一点是保证基础模式选择正确,即AN_EN=1, AN_1=1, AN_0=1。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173630.pngFigure 7 自动协商模式可配置的相关引脚的电阻配置如Figure 8所示,根据[3]可以得到RX_D0, RX_D3和LED_0的推荐电阻配置如下:https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/2018_2D00_08_2D00_01_5F00_173642.pngFigure 8 自动协商模式相关Strap电阻配置 RX_D0引脚电阻配置:MODE1(上拉电阻:OPEN; 下拉电阻:OPEN)和MODE4(上拉电阻:2.49k Ohm;下拉电阻:OPEN)。RX_D3引脚电阻配置:MODE1(上拉电阻:OPEN; 下拉电阻:OPEN)和MODE4(上拉电阻:2.49k Ohm;下拉电阻:OPEN)。LED_0引脚电阻配置:MODE3(上拉电阻:6.2k Ohm; 下拉电阻:1.96k Ohm)和MODE4(上拉电阻:OPEN;下拉电阻:OPEN)。

  • 发表了主题帖: 28335浮点性能测试

    测试条件: 1.测试程序在内部sram中运行 2.加载了浮点库rts2800_fpu32.lib,以及rts2800_fpu32_fast_supplement.lib库 3.CPU频率为150MHZ 4.测试软件为CCS6.0,使用定时器记录开始测试的时间以及测试结束的时间 测试结果: 1000次浮点加法的时间为133US 1000次浮点减法的时间为133US 1000次浮点乘法的时间为133US 1000次浮点除法的时间为458US 1000次浮点三角函数sin的时间为730US 1000次浮点三角函数cos的时间为730US 1000次浮点开立方的时间为5260US

  • 发表了主题帖: DSP28335使用FIFO的串口中断总结

    一、串行通信与并行通信 DSP控制器间,DSP控制器与外部设备间交换信息,通信,可采取的通信方式主要两大类1、串行通信 2、并行通信。 并行通信一般包括多条数据线、多条控制线和状态线,传输速度快,传输线路多,硬件开销大,不适合远距离传输。一般用在系统内部,如XINTF接口或者控制器内部如DMA控制器。 串行通信则在通信线路上既传输数据信息也传输联络控制信息,硬件开销小,传输成本低,但是传输速度慢,且收发双方需要通信协议,可用于远距离通信。串行通信可以分为两大类1、同步通信 2、异步通信 同步通信:发送器和接收器通常使用同一时钟源来同步。方法是在发送器发送数据时同时包含时钟信号,接收器利用该时钟信号进行接收。典型的如I2C、SPI。 异步通信:收发双方的时钟不是同一个时钟,是由双方各自的时钟实现数据的发送和接收。但要求双方使用同一标称频率,允许有一定偏差。典型的如SCI。 二、28335SCI介绍 F28335处理器共提供3个SCI接口,相对TI的C240X系列DSP的SCI接口,功能上有很大的改进,在原有功能基础上增加了通信速率自动检测和FIFO缓冲等新的功能,为了减小串口通信时CPU的开销,F28335的串口支持16级接收和发送FIFO。也可以不使用FIFO缓冲。SCI接收器和发送器有各自独立的中断和使能位,可以独立地操作实现半双工通信,或者同时操作实现全双工通信。为了保证数据完整,SCI模块对接收到的数据进行间断、极性、超限和帧错误的检测。为了减少软件的负担,SCI采用硬件对通信数据进行极性和数据格式检查。通过对16位的波特率控制寄存器进行编程,可以配置不同的SCI通信速率。 所谓的FIFO就是先进先出的意思。SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个帧为单位,而是以多个帧组成的一个包为信息单位的。比如说我的一个数据包由5个帧组成,第一个为控制字节,后四个字节共同组成一个浮点数。这时你可以设置FIFO接收中断为5个字节时产生中断。设置以后,每接收到5个字节后才会产生一次中断,而不是每接收一次产生一次中断。这样可以大幅减小CPU的开销。而先进先出的意思就是:在中断中,你读FIFO接收寄存器读到的数据是首先接收到的数据,再读一次的话读到的是接收到的第二个数据。而16深度的话就是最多能保存最近的16个接收数据,如果接收数据超过16个的话会产生相应的溢出,可以软件编程对溢出进行处理。 对于发送FIFO也是一样,你可以一次将多个数据放到发送FIFO中,然后DSP按先后顺序依次发送数据。 三、SCI模块的特点如下(通过相应的寄存器可以对这些功能进行设置)    (1)2个外部引脚:SCITXD为SCI数据发送引脚;SCIRXD为SCI数据接收引脚。两个引脚为多功能复用引脚,如果不使用可以作为通用数字量I/O。    (2)可编程通信速率,可以设置64K种通信速率。    (3)数据格式:         ◇ 1个启动位;         ◇ 1~8位可编程数据字长度;         ◇可选择奇校验、偶校验或无效校验位模式;         ◇ 1或2位的停止位。    (4)4种错误检测标志位:奇偶错误、超越错误、帧错误和间断检测。    (5)2种唤醒多处理器方式:空闲线唤醒(Idle-line)和地址位唤醒(AddressBit)。    (6)全双工或者半双工通信模式。    (7)双缓冲接收和发送功能。    (8)发送和接收可以采用中断和状态查询2种方式。    (9)独立地发送和接收中断使能控制。    (10)NRZ(非归零)通信格式。    (11)13个SCI模块控制寄存器,起始地址为7050H。    (12)自动通信速率检测(相对F140x增强的功能)。    (13)16级发送/接收FIFO(相对F240x增强的功能)。 四、SCI主要功能单元    (1) 1个发送器(TX)及相关寄存器。             ◇ SCITXBUF:发送数据缓冲寄存器,存放要发送的数据(由CPU装载);         ScicRegs.SCITXBUF=a;//向数据缓冲寄存器中写入数据即可发送该数据             ◇ TXSHF寄存器:发送移位寄存器,从SCITXBUF寄存器接收数据,并将数据移位到SCITXD引脚上,每次移1位数据。    (2)1个接收器(RX)及相关寄存器。             ◇ RXSHF寄存器:接收移位寄存器,从SCIRXD引脚移入数据,每次移1位;             ◇ SCIRXBUF:接收数据缓冲寄存器,存放CPU要读取的数据,来自远程处理器的数据装入寄存器RXSHF,然后又装入接收数据缓冲寄存器SCIRXBUF和接收仿真缓冲寄存器SCIRXEMU中。    (3)一个可编程的波特率产生器。    (4)数据存储器映射的控制和状态寄存器。

  • 发表了主题帖: DSP28335串口使用(查询发,中断收)

    SCI.C #include "sci.h" //串口BGPIO初始化 void InitSciB() {     EALLOW;     GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   // Enable pull-up for GPIO62 (SCITXDB)     GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;    // Enable pull-up for GPIO63 (SCIRXDB)    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;  // Asynch input GPIO19 (SCITXDB)     GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;  // Asynch input GPIO23 (SCIRXDB)     GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2;   // Configure GPIO19 for SCITXDB operation     GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2;   // Configure GPIO23 for SCIRXDB operation     EDIS;     ScibRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback,No parity,8 char bits,async mode, idle-line protoco     ScibRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,                                        // Disable RX ERR, SLEEP, TXWAKE     ScibRegs.SCICTL2.all =0x0003;  //接收中断使能     ScibRegs.SCICTL2.bit.RXBKINTENA =1;     #if (CPU_FRQ_150MHZ)       #if(BUADRATE_9600)      //设置波特率     ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.     ScibRegs.SCILBAUD    =0x00E7;       #endif        #if(BUADRATE_115200)     ScibRegs.SCIHBAUD    =0x0000;  // 115200 baud @LSPCLK = 37.5MHz.         ScibRegs.SCILBAUD    =0x0028;        #endif     #endif     #if (CPU_FRQ_100MHZ)         ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.         ScibRegs.SCILBAUD    =0x0044;     #endif    // ScibRegs.SCIFFTX.all=0xC000;  //FIFO功能使能     ScibRegs.SCIFFRX.all=0x0021;  //接收FIFO的深度为最低的5位,此处设置为1,没接受到一个字符都会产生接收中断    // ScibRegs.SCIFFCT.all=0x00;     ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset     //ScibRegs.SCIFFRX.bit.RXFIFORESET=1;  //复位接收FIFO } // Transmit a character from the SCI void put_char(char a) {     while (ScibRegs.SCICTL2.bit.TXRDY == 0);     ScibRegs.SCITXBUF=a; } void put_string(char * putchar) {     while(*putchar!= 0x00)     {     put_char(*putchar++);     } } //串口B接收中断 interrupt void SciB_RxInterIsr(void) {     u8 res;     res = (ScibRegs.SCIRXBUF.all) & 0x00FF;    // put_char(res);     switch(res)     {     case '0':  put_char('I'); break;     case '1':  put_char(' '); break;     case '2':  put_char('l'); break;     case '3':  put_char('O'); break;     case '4':  put_char('V'); break;     case '5':  put_char('E'); break;     case '6':  put_char(' '); break;     case '7':  put_char('Y'); break;     case '8':  put_char('O'); break;     case '9':  put_char('U'); break;     default :  break;     } ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; } main函数中相关函数和设置 InitSciB();  //串口B初始化 PieVectTable.SCIRXINTB = &SciB_RxInterIsr;   //SCIBX接收中断服务程序 IER |= M_INT9;    //开启CPU中断 组9  SCI_RX  CANB中断线1   PieCtrlRegs.PIEIER9.bit.INTx3=1;     //串口B接收中断  PIE Group 9, INT3

  • 发表了主题帖: 单片机的C语言中数组的用法

    数组是由具有相同类型的数据元素组成的有序集合。数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题。数组与普通变量一样,也必须先定义,后使用。数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。下面就对数组进行详细的介绍。 (1)一维数组 一维数组是最简单的数组,用来存放类型相同的数据。数据的存放是线性连续的。 用以下例程说明数组的建立、数据操作: #include /* ----------------------------------------------------- 此程序用以说明数组的建立、数据操作 ----------------------------------------------------- */ unsigned char array[10];//定义一个有10个单元的数组 void main() { unsigned char i; for(i=0;i<10;i++) { array=i; //用下标调用数组中的元素 } /* --------------------------------------- array |9|8|7|6|5|4|3|2|1|0| [9]~[0] --------------------------------------- */ while(1); } 数组名是用来表示数组的标识,其实它是数组的首地址,即一个指针。不过它所表示的地址是固定的,不能改动。如前几章所述的相关内容,array[2]与*(array+2)是等效的,不过不能用array++,因为array是常量。 上面的程序中的数组是静态建立的,以下例程来用说明数组的动态建立。 #include #include /* ----------------------------------------------------- 此程序用以说明数组的动态建立 ----------------------------------------------------- */ unsigned char *parray; void main() { unsigned char i; parray=(unsigned char *)malloc(10); //动态创建一个数组 for(i=0;i<10;i++) { parray=i; //向数组中赋值 } free(parray); //释放数组 while(1); } 字符串是数组的一个重要特例。它的每个单元的数据均为字符类型(char),最后一个单元为'\0'(0x00),用来表示字符串的结束。C51函数库中提供了专门对字符串进行处理的函数,用以下例程说明: #include #include /* ----------------------------------------------------- 此程序用以说明字符串 ----------------------------------------------------- */ char s[]={'y','a','h','o','o','\0'}; //定义一个字符串,并对它进行初始化,以'\0'结束 void main() { char s_temp[10]; strcpy(s_temp,s);//strcpy位于string.h头文件中,实现字符拷贝 //s为一个常量,不能s++ strcpy(s_temp,"yahoo");//与上面的语句等效 while(1); } 以下列出几种字符串的灵活用法,希望能够帮助读者深入了解字符串: #include #include /* ----------------------------------------------------- 此程序用以说明字符串的灵活运用 ----------------------------------------------------- */ /* ----------------------------------------------------- 此函数从字符串s中提取第n个子串,子串间由','分隔 返回指向该子串的指针 ----------------------------------------------------- */ char *get_sub_string(char *s,unsigned char n) { int i;int d=0;int fore=0; int len=strlen(s); for(i=0;i { if(s==',') { s='\0'; d++; if(d==n) { return s+fore; } else { fore=i+1; } } } return NULL; } void main() { unsigned char c; char string[20]; c="yahoo"[2]; //c='h' /*正如前面所述,字符串是由字符串的首地址来表示的, 字符串"yahoo"其实就是它的首地址,那就可以这样来 取其中的某个字符:"yahoo"[2]*/ strcpy(string,"123,234,345,456"); strcpy(string,get_sub_string(string,2)); while(1); }

  • 2019-04-20
  • 发表了主题帖: itop4412开发板添加开机启动程序

    1. 先编写代码,以helloworld.c为例子 复制代码 1 #include<stdio.h> 2 #include<unistd.h> //这个文件是什么 3  main() 4 { 5     int i = 0; 6     while(1) 7     { 8         sleep(2); 9         printf("hell0 world!\n"); 10     } 11 } 复制代码 2. 在ubuntu14环境下,用交叉编译器编译一下,生成.o文件,下一个问题,怎么通过串口把.o文件传给开发板? 3. 在串口log中看到,是不是4核板子,没任务的时候,关闭了另外3个? 1 [   63.520839] CPU1: shutdown 4. #vi root/etc/init.d/rcS这个文件在哪里,开发板和源码我都没找到?原来在根文件系统里面\4412_SCP精英版\linux-QT\root.tar.gz\etc\init.d\rcS,打开看一下,把/bin/int_helloworld &加入最后一行,讯为用的是nfs网络文件系统的方式。把根文件系统打包一下。开机即可看到输出。 复制代码 1 #! /bin/sh 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: 3 runlevel=S 4 prevlevel=N 5 umask 022 6 export PATH runlevel prevlevel 7 8 # 9 #    Trap CTRL-C &c only in this shell so we can interrupt subprocesses. 10 # 11 trap ":" INT QUIT TSTP 12 /bin/hostname iTOP-4412 13 14 #/bin/mount -n -t proc none /proc 15 #/bin/mount -n -t sysfs none /sys 16 #/bin/mount -n -t usbfs none /proc/bus/usb 17 #/bin/mount -t ramfs none /dev 18 [ -e /proc/1 ]    || /bin/mount -n -t proc  none /proc 19 [ -e /sys/class ] || /bin/mount -n -t sysfs none /sys 20 [ -e /dev/tty ]   || /bin/mount    -t ramfs none /dev 21 22 echo /sbin/mdev > /proc/sys/kernel/hotplug 23 /sbin/mdev -s 24 /bin/hotplug 25 # mounting file system specified in /etc/fstab 26 mkdir -p /dev/pts 27 mkdir -p /dev/shm 28 /bin/mount -n -t devpts none /dev/pts -o mode=0622 29 /bin/mount -n -t tmpfs tmpfs /dev/shm 30 /bin/mount -n -t ramfs none /tmp 31 /bin/mount -n -t ramfs none /var 32 mkdir -p /var/empty 33 mkdir -p /var/log 34 mkdir -p /var/log/boa 35 mkdir -p /var/lock 36 mkdir -p /var/run 37 mkdir -p /var/tmp 38 39 ln -sf /dev/ttyS2 /dev/tty2 40 ln -sf /dev/ttyS2 /dev/tty3 41 ln -sf /dev/ttyS2 /dev/tty4 42 43 amixer cset numid=5 127 44 amixer cset numid=6 1 45 amixer cset numid=30 8,0 46 amixer cset numid=40 1 47 amixer cset numid=43 1 48 amixer cset numid=47 1 49 50 /sbin/hwclock -s -f /dev/rtc 51 52 syslogd 53 /etc/rc.d/init.d/netd start 54 echo "                        " > /dev/tty1 55 echo "Starting networking..." > /dev/tty1 56 #sleep 1 57 #/etc/rc.d/init.d/httpd start 58 #echo "                        " > /dev/tty1 59 #echo "Starting web server..." > /dev/tty1 60 #sleep 1 61 #/etc/rc.d/init.d/leds start 62 #echo "                        " > /dev/tty1 63 #echo "Starting leds service..." > /dev/tty1 64 #echo "                        " 65 #sleep 1 66 67 #echo "*************************************" > /dev/ttySAC2 68 #echo "          " > /dev/ttySAC2 69 #echo "*************************************" > /dev/ttySAC2 70 #echo "*************************************" 71 #echo "         " 72 #echo "*************************************" 73 74 75 mkdir /mnt/disk 76 #mount -t yaffs2 /dev/mtdblock3 /mnt/disk 77 78 /sbin/ifconfig lo 127.0.0.1 79 /etc/init.d/ifconfig-eth0 80 81 echo "                                  " > /dev/tty1 82 echo "Starting Qtopia, please waiting..." > /dev/tty1 83 echo "                                  " 84 echo "Starting Qtopia4, please waiting..." 85 86 /bin/qtopia  & 87 /bin/int_helloworld       & 复制代码 5. trap ":" INT QUIT TSTP这个是什么语法? 在有些情况下,我们不希望自己的shell脚本在运行时刻被中断如数据库备份, 我们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号处理。 kill -l可以列出系统的信号名称,如下: 复制代码 1 -bash-3.00# kill -l 2 1) SIGHUP    2) SIGINT    3) SIGQUIT   4) SIGILL 3 5) SIGTRAP   6) SIGABRT   7) SIGBUS    8) SIGFPE 4 9) SIGKILL   10) SIGUSR1   11) SIGSEGV   12) SIGUSR2 5 13) SIGPIPE   14) SIGALRM   15) SIGTERM   17) SIGCHLD 6 18) SIGCONT   19) SIGSTOP   20) SIGTSTP   21) SIGTTIN 7 22) SIGTTOU   23) SIGURG   24) SIGXCPU   25) SIGXFSZ 8 26) SIGVTALRM  27) SIGPROF   28) SIGWINCH  29) SIGIO 9 30) SIGPWR   31) SIGSYS   34) SIGRTMIN  35) SIGRTMIN+1 10 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 11 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 12 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 14 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 15 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 16 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 17 64) SIGRTMAX 18 -bash-3.00# 复制代码 通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24 使用这样的语句可以使这些中断信号被忽略: trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP

  • 发表了主题帖: dsp6657的串口学习

    1. 打算用dsp6657学习下,先用串口实验吧。找一下芯片支持库Chip support libraries,路径D:\ti\pdk_C6657_1_1_1_4\packages\ti\csl,新建工程 2. 进入这个目录没找到串口的C库文件?只能去其他工程看下为啥了。确实没有,其他工程用的是这两个初始化的 1 platform_uart_init(); 2 platform_uart_set_baudrate(19200); 3. DSP6657有2个串口,支持流控可选 4. 搞定头文件的路径,还有库的路径D:\ti\pdk_C6657_1_1_1_4\packages\ti\platform\evmc6657l\platform_lib\lib\debug\ti.platform.evm6657l.lite.lib,现在很想知道怎么修改成相对路径,写了一个简单的程序,先测试一下 复制代码 1 #include "cslr_uart.h" 2 //估计导入包之后就可以直接使用包含的路径了 3 #include "ti/platform/platform.h" 4 5 //#define  PLATFORM_WRITE_IN  1 6 void delay(int j) 7 { 8   int i = 50000; 9   while(j--) 10   { 11       int i = 50000; 12       while(i--); 13   } 14 } 15 void main() 16 { 17     int i; 18     platform_init_flags  sFlags; 19     platform_init_config sConfig; 20     /* Status of the call to initialize the platform */ 21     Int32 pform_status; 22     /* Platform Information - we will read it form the Platform Library */ 23     platform_info       sPlatformInfo; 24 25     /* 26      * You can choose what to initialize on the platform by setting the following 27      * flags. We will initialize everything. 28     */ 29     memset( (void *) &sFlags,  0, sizeof(platform_init_flags)); 30     memset( (void *) &sConfig, 0, sizeof(platform_init_config)); 31 32     sFlags.pll = 0; 33     sFlags.ddr = 0; 34     sFlags.tcsl = 0;    /* Time stamp counter   */ 35     sFlags.phy  = 0;    /* Ethernet                     */ 36     sFlags.ecc = 0; 37 38     sConfig.pllm = 0; 39 40     pform_status = platform_init(&sFlags, &sConfig); 41     if (pform_status == Platform_EOK) { 42             /* Get information about the platform so we can use it in various places */ 43             memset( (void *) &sPlatformInfo, 0, sizeof(platform_info)); 44             (void) platform_get_info(&sPlatformInfo); 45     } 46 47     platform_uart_init(); 48     platform_uart_set_baudrate(19200); 49     //串口初始化 50     //打印一段 51     while(1) 52     { 53 54         platform_uart_write(0x55); 55         (void) platform_led(1, PLATFORM_LED_ON, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); 56         delay(50); 57         (void) platform_led(1, PLATFORM_LED_OFF, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); 58         delay(50); 59     } 60 } 复制代码 5. 估计是没有cmd文件,所以load下载程序的时候失败了。不过奇怪的是,其他的6657工程没有CMD文件。C665x DSP 集成了大量的片上存储器。除了 32KB 的 L1 程序和数据高速缓存区,每核配有 1024KB 专用存储器,可配置为可映射 RAM 或缓存。该器件还集成了 1024KB 的多核共享存储器,可以作为一个共享 L2 SRAM或共享的 L3 的 SRAM。所有的 L2 存储器具有检错和纠错能力。这次写到L1空间试一下。如果要触发core1运行,应该还需要在core0运行起来后,由core0向core1写IPC触发。 6. 建立一个CMD文件测试一下 复制代码 1 /* 2  *  Linker command file 3  * 4  */ 5 6 -c 7 -heap  0x41000 8 -stack 0xa000 9 10 /* Memory Map 1 - the default */ 11 MEMORY 12 { 13     L1PSRAM (RWX)  : org = 0x0E00000, len = 0x7FFF 14     L1DSRAM (RWX)  : org = 0x0F00000, len = 0x7FFF 15 16     L2SRAM (RWX)   : org = 0x0800000, len = 0x080000 17     MSMCSRAM (RWX) : org = 0xc000000, len = 0x100000 18     DDR3 (RWX)     : org = 0x80000000,len = 0x20000000 19 } 20 21 SECTIONS 22 { 23     .csl_vect   >       L2SRAM 24     .text       >       L2SRAM 25     GROUP (NEAR_DP) 26     { 27     .neardata 28     .rodata 29     .bss 30     } load > L2SRAM 31     .stack      >       L2SRAM 32     .cinit      >       L2SRAM 33     .cio        >       L2SRAM 34     .const      >       L2SRAM 35     .data       >       L2SRAM 36     .switch     >       L2SRAM 37     .sysmem     >       L2SRAM 38     .far        >       L2SRAM 39     .testMem    >       L2SRAM 40     .fardata    >       L2SRAM 41     platform_lib >         L2SRAM 42 } 复制代码 7. 仿真测试的时候发现LED灯会闪烁,但是串口的数据不对,怀疑是时钟的配置不对 8. 测试的时候以为是CFG文件的问题,就添加了一个CFG文件(添加的时候,CCS会提示是否需要把RTSC添加进工程,我添加了),没什么用处,删掉CFG文件,但是CCS提示RTSC需要一个.cfg文件,看样子还需要把RTSC也删除。搞不定,重新建了个工程,把之前的C文件和CMD文件拷贝进来。 9. 串口波特率不对头,估计是系统时钟配置的问题,那么没办法只能用逻辑分析仪抓包看一下,其实每次是有数据的,因为之前把波特率调低有乱码数据。下图是RS232的波形,每个位是520.5us,用1000000/520.5 = 1923波特率。 10. 看下串口收到的数据,正确了,接下来需要研究下DSP6657的时钟配置函数了。 11. 看下波特率配置函数,时钟源是PLATFORM_UART_INPUT_CLOCK_RATE,不过系统时钟不对头,比较麻烦。 复制代码 1 Platform_STATUS platform_uart_set_baudrate(uint32_t baudrate) { 2     uint16_t brate; 3     IFPRINT(platform_write("platform_uart_set_baudrate(baudrate=%d) called \n", baudrate)); 4     brate = ((Uint16) (PLATFORM_UART_INPUT_CLOCK_RATE/(baudrate * 16))); 5     UartSetBaudRate(brate); 6     return Platform_EOK; 7 }

  • 发表了主题帖: CC3200模块第一篇之-wlan_ap例程测试

    1. 本次采用利尔达的CC3200模块,CC3200主时钟80M,内部没有flash,必须外接SPI Flash。本次测试采用利尔达科技的CC3200的底板和模块(左边)。烧写连接VCC, GND, RXD, TXD, SOP2, RST这6根线即可完成下载。串口下载的时候SOP2需要上拉,正常运行的时候SOP2留空。 2. 使用IAR工具打开工程,看下main代码,其中VStartSimpleLinkSpawnTask这个函数搞不明白是什么?SimpleLink是TI注册的一个商标,CC3200是CC3200SimpleLink™Wi-Fi 复制代码 1 void main() 2 { 3   long lRetVal = -1; 4   // 板子初始化配置 5   BoardInit(); 6   // 引脚复用配置 7   PinMuxConfig(); 8   //初始化穿口 9   InitTerm(); 10   // 启动SimpleLink Host 11   lRetVal = VStartSimpleLinkSpawnTask(SPAWN_TASK_PRIORITY); 12   if(lRetVal < 0) 13   { 14     ERR_PRINT(lRetVal); 15     LOOP_FOREVER(); 16   } 17   // 启动 WlanAPMode 任务 18   lRetVal = osi_TaskCreate( WlanAPMode, \ 19     (const signed char*)"wireless LAN in AP mode", \ 20       OSI_STACK_SIZE, NULL, 1, NULL ); 21   if(lRetVal < 0) 22   { 23     ERR_PRINT(lRetVal); 24     LOOP_FOREVER(); 25   } 26   // 开始任务调度 27   osi_start(); 28 } 复制代码 3. 深入第一个函数去看看做了什么,创建了一个队列和一个任务,目前不知道这个任务是什么用途,其次2048的任务空间是从哪里分配的,作为栈的空间,任务切换的时候保存任务的当前环境变量。 复制代码 1 OsiReturnVal_e VStartSimpleLinkSpawnTask(unsigned portBASE_TYPE uxPriority) 2 { 3     xSimpleLinkSpawnQueue = xQueueCreate( slQUEUE_SIZE, sizeof( tSimpleLinkSpawnMsg ) ); 4     if(0 == xSimpleLinkSpawnQueue) 5     { 6         return OSI_OPERATION_FAILED; 7     } 8     if(pdPASS == xTaskCreate( vSimpleLinkSpawnTask, ( portCHAR * ) "SLSPAWN",\ 9                          (2048/sizeof( portSTACK_TYPE )), NULL, uxPriority, &xSimpleLinkSpawnTaskHndl )) 10     { 11         return OSI_OK; 12     } 13     return OSI_OPERATION_FAILED; 14 } 复制代码 4. 延伸一个问题,任务里面的临时变量和数据还有任务里面的malloc,是从任务创建时候分配的栈里面再分配的吗?书上说是堆栈空间,malloc是从堆里分配的,2048/sizeof( portSTACK_TYPE )单位是字,4个字节,所以实际要乘以4的。 5. STM32有2个栈指针,MSP,PSP,一个是系统堆栈指针MSP,一个是任务堆栈指针PSP,任务堆栈用来做什么?保存局部变量,函数嵌套,任务切换的时候保存内核寄存器(保存在栈的高地址)和任务当前的状态(局部变量保存在低地址)。堆栈大小应该怎么去计算。任务里面的局部变量是保存在任务的栈里面的。 6. 继续看这个代码,一直循环接收队列,tSimpleLinkSpawnMsg Msg;这个应该是给wifi网络处理器返回应用处理器的消息队列。这个结构体有2个参数,一个函数和一个数据,都是通过队列传送的。 复制代码 1 void vSimpleLinkSpawnTask(void *pvParameters) 2 { 3     tSimpleLinkSpawnMsg Msg; 4     portBASE_TYPE ret=pdFAIL; 5     for(;;) 6     { 7         ret = xQueueReceive( xSimpleLinkSpawnQueue, &Msg, portMAX_DELAY ); 8         if(ret == pdPASS) 9         { 10                 Msg.pEntry(Msg.pValue); 11         } 12     } 13 } 复制代码 7. 看下AP模式的设置代码 复制代码 void WlanAPMode( void *pvParameters ) {      int iTestResult = 0;   unsigned char ucDHCP;   long lRetVal = -1;   InitializeAppVariables();   //恢复成默认模式   lRetVal = ConfigureSimpleLinkToDefaultState();   if(lRetVal < 0)   {     if (DEVICE_NOT_IN_STATION_MODE == lRetVal)       UART_PRINT("Failed to configure the device in its default state \n\r");     LOOP_FOREVER();   }   UART_PRINT("Device is configured in default state \n\r");   //启动网络   lRetVal = sl_Start(NULL,NULL,NULL);   if (lRetVal < 0)   {     UART_PRINT("Failed to start the device \n\r");     LOOP_FOREVER();   }   UART_PRINT("Device started as STATION \n\r");   //配置成AP模式   if(lRetVal != ROLE_AP)   {     if(ConfigureMode(lRetVal) != ROLE_AP)     {       sl_Stop(SL_STOP_TIMEOUT);       LOOP_FOREVER();     }   }   //AP模式下,是否获取到自己的IP地址   while(!IS_IP_ACQUIRED(g_ulStatus))   {     //looping till ip is acquired   }   unsigned char len = sizeof(SlNetCfgIpV4Args_t);   SlNetCfgIpV4Args_t ipV4 = {0};   // 获取网络配置   lRetVal = sl_NetCfgGet(SL_IPV4_AP_P2P_GO_GET_INFO,&ucDHCP,&len,                          (unsigned char *)&ipV4);   if (lRetVal < 0)   {     UART_PRINT("Failed to get network configuration \n\r");     LOOP_FOREVER();   }   //等待STA设备连接,并给STA分配IP地址   while(!IS_IP_LEASED(g_ulStatus))   {   }   //和STA设备建立TCP连接   lRetVal = BsdTcpClient(PORT_NUM);   if(lRetVal < 0)   {     UART_PRINT("TCP Client failed\n\r");     LOOP_FOREVER();   }   while(1); } 复制代码 查看下AP模式的设置函数 复制代码 1 static int ConfigureMode(int iMode) 2 { 3   char    pcSsidName[33] = "cc3200_tcptest"; 4   long   lRetVal = -1; 5 6   //设置为AP模式 7   lRetVal = sl_WlanSetMode(ROLE_AP); 8   ASSERT_ON_ERROR(lRetVal); 9   //设置AP模式的SSID 10   lRetVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(pcSsidName), 11                        (unsigned char*)pcSsidName); 12   ASSERT_ON_ERROR(lRetVal); 13    14   UART_PRINT("Device is configured in AP mode\n\r"); 15    16   /* Restart Network processor */ 17   lRetVal = sl_Stop(SL_STOP_TIMEOUT); 18    19   // reset status bits 20   CLR_STATUS_BIT_ALL(g_ulStatus); 21   return sl_Start(NULL,NULL,NULL); 22 } 复制代码 8. 这个工程包含了3个库文件,其中simplelink.a比较特殊,在SDK中找个这个相关工程并打开。问题是sl_start究竟是启动的什么?和wifi网络处理器怎么通信的? 1 $PROJ_DIR$/../../../simplelink/ewarm/OS/Exe/simplelink.a 2 $PROJ_DIR$/../../../driverlib/ewarm/Release/Exe/driverlib.a 3 $PROJ_DIR$/../../../oslib/ewarm/free_rtos/Exe/free_rtos.a 9. 继续下一步 复制代码 1 _i16 sl_WlanSetMode(const _u8    mode) 2 { 3     _SlwlanSetModeMsg_u      Msg; 4     Msg.Cmd.mode  = mode; 5     VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL)); 6     return (_i16)Msg.Rsp.status; 7 } 复制代码 10. 研究下,应用处理器是怎么给wifi网络处理器发数据的,不过以下可能有错误的 复制代码 1 //以sl_WlanSet为例子,以下层层调用,最后通过SPI接口发出 2 第1步:sl_WlanSet 3 第2步:VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL)); 4 第3步:_SlDrvMsgWrite 5 第4步:NWP_IF_WRITE_CHECK 6 第5步:spi_Write 7 第6步:spi_Write_CPU 复制代码 11. 用uniflash烧写测试一下,不过下次要花时间研究下CC3200的内存分配了,涉及到串口升级,OTA升级等 12. 需要在电脑上建立一个tcp server测试一下,以前测试CC3200的TCP传输速度只有100KB每秒不知道原因,有机会要再次测试一下。

  • 回复了主题帖: 毫米波传感器检测移动车内人员乘坐技术

    车辆乘员检测参考设计

  • 发表了主题帖: 毫米波传感器检测移动车内人员乘坐技术

          汽车设计师已成功将毫米波(mmWave)传感器集成到多个汽车驾驶室内应用中。      这些应用之一是能够在各类照明条件和传感器放置中检测车内人员乘坐情况,而不管其是否移动。这可帮助汽车系统检测到留在车内无人看管的儿童或人员位置,以进行温度控制。       Azcom Technology展示了AWR1642毫米波传感器结合Azcom专有算法,如何能够可靠识别座椅上人员入座情况。我们以不同的速度,及不同的环境(城市、高速公路)和驾驶室(光照、温度)条件进行驾驶,并分析了不同的座椅配置。      在演示中,传感器将从天窗悬挂下来,朝向后座(如图1所示),尽管在最终安装中它更可能被放置在座椅靠背内部、后视镜周围或车顶内部等地方。由于毫米波能够感知各种材料,包括构成车辆的材料,因此安装在座椅或车顶内时,传感性能不会发生变化。包括Azcom Technology增强功能的所有处理都在传感器上运行,而主机上的图形用户界面有助于可视化结果。https://e2echina.ti.com/resized-image/__size/1230x350/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-78/6165.1.jpg图1:安装在车辆天窗上的毫米波传感器       此用例的主要挑战是在引擎开启和汽车行驶时实现充分的检测稳健性。这两个事件的组合引入了来自数个在静态设置中不存在的振动模式的信号的一组中断。出于此原因,我们设计了一种新的算法。此算法对来自道路的振动不太敏感,且能够检测车内人员入座情况的所有可能组合。       除了车内人员入座情况检测参考设计,我们还应用并验证了这些增强功能。图2、3、4和5是来自样品驱动的一些快照,以及检测车内人员入座情况的图示。       在图2中,在城市中驾驶时后排座椅无人员入座,算法检测到无故障。统计数据按处理桢的比率计算:此用例中为6 fps。在现实产品中,频率较低的二级决策工具会使检测变得更加稳健。 https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-78/WeChat-Screenshot_5F00_20190419145703.png图2:后排座椅无人员入座在图3中,该算法成功检测到区域1中有人员入座,如红框所示。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-78/WeChat-Screenshot_5F00_20190419145939.png图 3:后排座位检测到人员入座图4侧重于使用不同汽车驾驶室时算法的准确性。通过测试两种不同的车型,我们在以不同速度行驶时展示了可靠的人员入座检测情况。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-78/WeChat-Screenshot_5F00_20190419150051.png图 4:在不同的汽车乘坐舱内检测人员入座情况图5所示为设计扩展到两排四个座椅。尽管此场景更复杂且更具挑战性,但在特殊调整和优化之后,算法的表现与单排设置效果一样佳。https://e2echina.ti.com/resized-image/__size/1230x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-78/WeChat-Screenshot_5F00_20190419150127.png图 5:四座配置凭借在人员入座情况检测应用方面的专知以及TI平台、信号处理、射频和嵌入式系统设计与开发方面的深厚专业知识,Azcom Technology提供一系列增值研发服务,可助您构建启用毫米波的产品,并大大缩短产品上市时间。

  • 2019-04-19
  • 回复了主题帖: 毫米波不懂就问:有关毫米波雷达的在汽车上最新应用

    TI的毫米波芯片把射频和数据处理都集成在了一块芯片里。

  • 2019-04-18
  • 发表了主题帖: 国内外车载雷达产品现状

    本帖最后由 Aguilera 于 2019-4-18 22:02 编辑     美国、欧洲和日本在车载雷达技术研究方面处于领先地位。目前,越来越多的公司和供应商投入到汽车雷达系统研制、器件开发和算法研究当中。1999年,德国奔驰汽车公司率先采用77GHz毫米波雷达的自主巡航控制系统;2003年,博世研制的77GHz车载雷达正式投入商用;2013年,松下与富士通研制出79GHz频带毫米波车载雷达。目前,毫米波车载雷达的关键技术主要由大陆、博世、电装、奥托立夫等传统汽车零部件巨头所垄断,特别是77GHz 毫米波雷达,只有少数几个国外公司掌握该技术。       在我国,24GHz和77GHz毫米波集成电路的关键技术已取得突破。其中,24GHz毫米波集成电路已实现量产并试用中,但77GHz毫米波集成电路的国产化一直进展缓慢。国内相关产品的主要进展情况为:东南大学毫米波国家重点实验室已完成8mm波段混频器、倍频器、开关、放大器等单功能芯片的研制,目前,正在开展单片接收/发射前端的设计与研制;厦门意行半导体科技有限公司在24GHz汽车主动安全雷达射频前端集成电路取得突破,是国内唯一一家提供24GHz汽车主动安全雷达射频前端MMIC解决方案的企业;沈阳承泰科技有限公司在研发77GHz汽车毫米波雷达关键技术上取得突破,预计产品不久将问世。        目前,国内毫米波雷达产业的发展主要面临以下几个问题:      ①行业整体竞争力偏弱。目前,国内的产业链尚未成熟,国外商用车载雷达已经走了几十年的历史了,国内近几年才开始起步,产品上市要面临激烈的竞争压力。       ②人才极度缺乏。车载雷达研发需要丰富的雷达系统和毫米波射频设计经验与能力,而这一领域的人才多集中在军工企业和国外企业。       ③资金压力大。由于技术基础底子薄,研发所需的测试设备和生产设备都需要从国外购买,价格高昂,后期收益情况又未知,国内相关生产厂家面临很大的资金压力。        ④开发周期较长。一款毫米波雷达开发周期就要12个月以上,产品还需要通过静态测试、动态测试、上车测试以及各种复杂的环境下测试,整个研制周期至少要2年以上。

  • 发表了主题帖: DSP c6678的启动方式

    C6678是多核处理器,有8个核。每个核都有其独立的32KB的L1P,32KB的L1D以及512KB的L2,此外8个核还有4M的共享的MSM,接口资源包括SRIO,PCIe,Hyperlink,Gigabit Ethernet(GbE),EMIF,TSIP,UART,I2C,SPI接口。针对这些接口,RBL(ROM bootloader)支持多种程序加载模式: (1)SPI加载模式:可以通过SPI外挂一个NorFLASH,将待加载的程序通过TI官方提供的转化工具将需要加载的.out程序转化成.h文件,然后通过仿真器将数据烧写到NorFLASH中,最后将c6678配置成SPI启动方式,重新上电即可。 (2)PCIE加载模式:C6678存在PLL锁不住频率的问题,所以需要将6678配制成二次加载模式。即先用SPI加载,然后通过SPI加载的程序初始化好PLL时钟及PCIE接口,然后通过PCIE接口加载程序。上位机通过PCIE直接写DSP内存来实现加载功能的。首先通过TI官方提供的工具将要加载的.out程序转化为.bin文件,然后读取.bin文件通过PCIE接口直接写到DSP内存,然后触发运行即可。 (3)以太网加载模式,该加载模式是通过网口发送udp包来完成的。将要加载的.out文件通过TI提供的工具转化为.eth文件,然后将DSP配置成以太网加载模式,DSP会通过网口向外界广播BOOTP的广播包,通过抓包工具抓包,并分析DSP的MAC地址,在通过ARP命令将该MAC地址映射到与上位机同一网段的IP地址上,最后用TI的pcsendpkt工具将.eth文件发送给DSP,DSP收到上位机发送的UDP的数据包后,会自动凭借数据, 好文要顶

  • 发表了主题帖: DSP F2812的中断

    本帖最后由 Aguilera 于 2019-4-18 21:54 编辑 看了TI的文档:TMS321x281x DSP System Control and Interrupts Reference Guide,spru078b.pdf有一些心得:1、一个外设中断要到达CPU,让CPU处理,得经过许多道门https://pic002.cnblogs.com/images/2012/366402/2012112615154895.pngPIEIER->(PIEACKx)->IER->INTM在CPU级别上面,有1个不可屏蔽中断(NMI),16个可屏蔽中断(INT1~INT14,RTOSINT和DLOGINT)。其中的INT1~INT12每个又通过PIE扩展出8个外设中断,所以外设中断可以有12*8=96个,F2812仅仅用了其中45个:https://pic002.cnblogs.com/images/2012/366402/2012112615210942.png2、关于中断嵌套,硬件上没直接支持,但软件可实现  先看F2812的处理流程图:https://pic002.cnblogs.com/images/2012/366402/2012112615260237.png可以看到,在进入中断服务程序之前的Stage H,INTM已经被置位(中断关闭),所以不可能在响应其他的中断了,之后的其他中断都会在Stage G这里卡住。所以,如果你要允许中断嵌套,除非在你的中断程序里面手动把INTM清零(EINT),具体例子可看sprc097的sw_prioritized_interrupts,里面的例子就是这么干的,它的中断服务程序都有EINT这一句,以此为基础,来实现中断的嵌套。3、关于优先级不能自己设定,硬件本身有自己的一套优先级,当时看上面流程图可知,因为硬件不可实现中断嵌套,所以这个优先级仅仅当两个中断同时发生的时候才起作用,所以一般不用管了。sprc097的sw_prioritized_interrupts例子可以有软件优先级。4、一个需要注意的地方,PIEACKx的清零先想一个问题,我们知道,给PIEACK的对应位写1即可清除这个位,以便让中断控制器响应同组的其他中断,但下面这样清除Group1的PIEACK位对不对:PieCtrl.PIEACK.bit.Ack1 = 1; 回答这个问题之前,先参考第2点中的流程图,考虑一个问题,PIEAck这个寄存器我们用了第0~11位来对应第1到第12组中断,那么这12位中可不可能同时有多个位为1?答案是肯定的,因为虽然不能中断嵌套,但是各组中断被卡的地方在Stage G,假如同时有多组中都有中断发生,那么到Stage G才会被卡,这个之前,对应各组的PIEAck都已经在Stage C之后被置1了,所以PIEAck完全有可能有多个位被置1.    再来考虑上面写法,虽然上面用了位域的写法,语法上只是对Ack1这一位写1,但是位域最终在处理器的执行上,还是要一次重新写一次寄存器,而这个写入是按照读-修改-写的流程的,即先读取PIEAck的值,再把Ack1修改为1(按上面语句),最后再把修改完之后的值写入寄存器PIEAck,这个时候就会出现问题了,因为在读入的PIEAck中,可能有其他组有中断在等待了,它对应的Ack为1,你这样一写1进去,就有可能导致同组的其他中断把这个中断覆盖掉。所以正确的写法应该是:#define PIEACK_GROUP1 0x0001……PieCtrl.PIEACK.all = PIEACK_GROUP1; 因为PIEACK写0无效,不起作用,这样写就仅仅影响了第一位了。这个具体可见sprc097中的DSP281x_HeaderFiles_QuickStart_Readme.pdf 6.1.1一节。

  • 发表了主题帖: 关于DSP 数据的定标

    一 DSP定点算数运算 1 数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。 DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。因此, 二进制数0010000000000011b=8195 二进制数1111111111111100b= -4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如, 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数(xq):xq=(int)x* 2Q 定点数(xq)转换为浮点数(x):x=(float)xq*2-Q 例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为163幼*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。 表1.1 Q表示、S表示及数值范围 Q表示 S表示 十进制数表示范围 Q15 S0.15 -1≤x≤0.9999695 Q14 S1.14 -2≤x≤1.9999390 Q13 S2.13 -4≤x≤3.9998779 Q12 S3.12 -8≤x≤7.9997559 Q11 S4.11 -16≤x≤15.9995117 Q10 S5.10 -32≤x≤31.9990234 Q9 S6.9 -64≤x≤63.9980469 Q8 S7.8 -128≤x≤127.9960938 Q7 S8.7 -256≤x≤255.9921875 Q6 S9.6 -512≤x≤511.9804375 Q5 S10.5 -1024≤x≤1023.96875 Q4 S11.4 -2048≤x≤2047.9375 Q3 S12.3 -4096≤x≤4095.875 Q2 S13.2 -8192≤x≤8191.75 Q1 S14.1 -16384≤x≤16383.5 Q0 S15.0 -32768≤x≤32767 2 高级语言:从浮点到定点 我们在编写DSP模拟算法时,为了方便,一般都是采用高级语言(如C语言)来编写模拟程序。程序中所用的变量一般既有整型数,又有浮点数。如例1.1程序中的变量i是整型数,而pi是浮点数,hamwindow则是浮点数组。 例1.1 256点汉明窗计算 int i;+ float pi=3.14l59; float hamwindow[256]; for(i=0;i<256;i++) hamwindow=0.54-0.46*cos(2.0*pi*i/255); 如果我们要将上述程序用某种足点DSP芯片来实现,则需将上述程序改写为DSP芯片的汇编语言程序。为了DSP程序调试的方便及模拟定点DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法。下面我们讨论基本算术运算的定点实现方法。 2.1 加法/减法运算的C语言定点摸拟 设浮点加法运算的表达式为: float x,y,z; z=x+y; 将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标 temp=x+temp; z=temp>>(Qx-Qz),若Qx>=Qz z=temp<<(Qz-Qx),若Qx<=Qz 例1.4结果超过16位的定点加法 设x=l5000,y=20000,则浮点运算值为z=x+y=35000,显然z>32767,因此 Qx=1,Qy=0,Qz=0,则定点加法为: x=30000;y=20000; temp=20000<<1=40000; temp=temp+x=40000+30000=70000; z=70000L>>1=35000; 因为z的Q值为0,所以定点值z=35000就是浮点值,这里z是一个长整型数。当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保持运算精度时,则必须保持32位结果。如果程序中是按照16位数进行运算的,则超过16位实际上就是出现了溢出。如果不采取适当的措施,则数据溢出会导致运算精度的严重恶化。一般的定点DSP芯片都没有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值(上溢为7FFFH,下溢为8001H),从而达到防止溢出引起精度严重恶化的目的。 2.2乘法运算的C语言定点模拟 设浮点乘法运算的表达式为: float x,y,z; z=xy; 假设经过统计后x的定标值为Qx,y的定标值为Qy,乘积z的定标值为Qz,则 z=xy zq*2-Qx=xq*yq*2-(Qx+Qy) zq=(xqyq)2Qz-(Qx+Qy) 所以定点表示的乘法为: int x,y,z; long temp; temp=(long)x; z=(temp*y)>>(Qx+Qy-Qz); 例1.5定点乘法。 设x=18.4,y=36.8,则浮点运算值为=18.4*36.8=677.12; 根据上节,得Qx=10,Qy=9,Qz=5,所以 x=18841;y=18841; temp=18841L; z=(18841L*18841)>>(10+9-5)=354983281L>>14=21666; 因为z的定标值为5,故定点z=21666,即为浮点的z=21666/32=677.08。 2.3除法运算的C语言定点摸拟 设浮点除法运算的表达式为: float x,y,z; z=x/y; 假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy,商z的定标值为Qz,则 z=x/y zq*2-Qz=(xq*2-Qx)/(yq*2-Qy) zq=(xq*2(Qz-Qx+Qy))/yq 所以定点表示的除法为: int x,y,z; long temp; temp=(long)x; z=(temp<<(Qz-Qx+Qy))/y; 例1.6定点除法。 设x=18.4,y=36.8,浮点运算值为z=x/y=18.4/36.8=0.5; 根据上节,得Qx=10,Qy=9,Qz=15;所以有 z=18841,y=18841; temp=(long)18841; z=(18841L<<(15-10+9)/18841=3O8690944L/18841=16384; 因为商z的定标值为15,所以定点z=16384,即为浮点z=16384/215=0.5。 2.4程序变量的Q值确定 在前面几节介绍的例子中,由于x,y,z的值都是已知的,因此从浮点变为定点时Q值很好确定。在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。 设变量的绝对值的最大值为|max|,注意|max|必须小于或等于32767。取一个整数n,使满足 2n-1<|max|<2n 则有 2-Q=2-15*2n=2-(15-n) Q=15-n 例如,某变量的值在-1至+1之间,即|max|<1,因此n=0,Q=15-n=15。 既然确定了变量的|max|就可以确定其Q值,那么变量的|max|又是如何确定的呢?一般来说,确定变量的|max|有两种方法。一种是理论分析法,另一种是统计分析法。 1. 理论分析法 有些变量的动态范围通过理论分析是可以确定的。例如: (1)三角函数。y=sin(x)或y=cos(x),由三角函数知识可知,|y|<=1。 (2)汉明窗。y(n)=0.54一0.46cos[nπn/(N-1)],0<=n<=N-1。因为-1<=cos[2πn/(N-1)]<=1,所以0.08<=y(n)<=1.0。 (3)FIR卷积。y(n)=∑h(k)x(n-k),设∑|h(k)|=1.0,且x(n)是模拟信号12位量化值,即有|x(n)|<=211,则|y(n)|<=211。 (4)理论已经证明,在自相关线性预测编码(LPC)的程序设计中,反射系数ki满足下列不等式:|ki|<1.0,i=1,2,...,p,p为LPC的阶数。 2. 统计分析法 对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。例如,在语音信号分析中,统计分析时就必须来集足够多的语音信号样值,并且在所采集的语音样值中,应尽可能地包含各种情况。如音量的大小,声音的种类(男声、女声等)。只有这样,统计出来的结果才能具有典型性。 当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取比统计值稍大些,使用DSP芯片提供的溢出保护功能等。 2.5浮点至定点变换的C程序举例 本节我们通过一个例子来说明C程序从浮点变换至定点的方法。这是一个对语音信号(0.3~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在insp.dat文件中。 例1.7语音信号800Hz 19点FIR低通滤波C语言浮点程序。 #i nclude const int length=180/*语音帧长为180点=22.5ms@8kHz采样*/ void filter(int xin[],int xout[],int n,float h[]);/*滤波子程序说明*/ /*19点滤波器系数*/ static float h[19]= {0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568, -0.008692503,0.06446265,0.1544655,0.2289794,0.257883, 0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568, -0.04743239,-0.02881839,-0.009012882,O.01218354}; static int xl[length+20]; /*低通滤波浮点子程序*/ void filter(int xin[],int xout[],int n,float h[]) { int i,j; float sum; for(i=0;i for(i=0;i<length;i++) { sum=0.0; for(j=0;j<n;j++)sum+=h[j]*x1[i-j+n-1]; xout=(int)sum; for(i=0;i<(n-l);i++)x1[n-i-2]=xin[length-1-i]; } /*主程序*/ void main() FILE *fp1,*fp2; int frame,indata[length],outdata[length]; fp1=fopen(insp.dat,"rb");/* 输入语音文件*/ fp2=fopen(Outsp.dat,"wb");/* 滤波后语音文件*/ frame=0; while(feof(fp1) ==0) { frame++; printf(“frame=%d\n”,frame); for(i=0;i<length;i++)indata=getw(fp1); /*取一帧语音数据*/ filter(indata,outdata,19,h);/*调用低通滤波子程序*/ for(i=0;i<length;i++)putw(outdata,fp2);/*将滤波后的样值写入文件*/ } fcloseall();/*关闭文件*/ return(0); } 例1.8语音信号800Hz l9点FIR低通滤波C语言定点程序。 #i nclude const int length=180; void filter (int xin[],int xout[],int n,int h[]); static int h[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450, 7503,5061,2112,-285,-1503,-1555,-945,-296,399};/*Q15*/ static int x1[length+20]; /*低通滤波定点子程序*/ void filter(int xin[],int xout[],int n,int h[]) int i,j; long sum; for(i=0;i<length;i++)x1[n+i-111=xin]; for(i=0;i<1ength;i++) sum=0; for(j=0;j<n;j++)sum+=(long)h[j]*x1[i-j+n-1]; xout=sum>>15; for(i=0;i<(n-1);i++)x1[n-i-2]=xin[length-i-1]; } 主程序与浮点的完全一样。“ 3 DSP定点算术运算 定点DSP芯片的数值表示基于2的补码表示形式。每个16位数用l个符号位、i个整数位和15-i个小数位来表示。因此: 00000010.10100000 表示的值为: 21+2-1+2-3=2.625 这个数可用Q8格式(8个小数位)来表示,其表示的数值范围为-128至+l27.996,一个Q8定点数的小数精度为1/256=0.004。 虽然特殊情况(如动态范围和精度要求)必须使用混合表示法。但是,更通常的是全部以Q15格式表示的小数或以Q0格式表示的整数来工作。这一点对于主要是乘法和累加的信号处理算法特别现实,小数乘以小数得小数,整数乘以整数得整数。当然,乘积累加时可能会出现溢出现象,在这种情况下,程序员应当了解数学里面的物理过程以注意可能的溢出情况。下面我们来讨论乘法、加法和除法的DSP定点运算,汇编程序以TMS320C25为例。 3.1定点乘法 两个定点数相乘时可以分为下列三种情况: 1. 小数乘小数 例1.9 Q15*Q15=Q30 0.5*0.5=0.25 0.100000000000000;Q15 * 0.100000000000000;Q15 -------------------------------------------- 00.010000000000000000000000000000=0.25;Q30 两个Q15的小数相乘后得到一个Q30的小数,即有两个符号位。一般情况下相乘后得到的满精度数不必全部保留,而只需保留16位单精度数。由于相乘后得到的高16位不满15位的小数据度,为了达到15位精度,可将乘积左移一位,下面是上述乘法的TMS320C25程序: LT OP1;OP1=4000H(0.5/Q15) MPY OP2;oP2=4000H(0.5/Ql5) PAC SACH ANS,1;ANS=2000H(0.25/Q15)

  • 发表了主题帖: 分享CCS7.3 安装步骤

    1.首先到TI官网进行下载最新本CCS7.3。 2.下载完成后,双击CCS_SETUP.EXE进行安装。安装路径注意不要有中文 3.按照提示,点击continue,next…………. 到达如下界面选择性安装。选择的产品越多,安装占用的硬盘空间越大,安装时间越长 剩下的就是按照提示进行等待,安装时间根据个人电脑配置而异。 CCS7.3新建工程 1. 打开CCS图标, 就会出现工作空间指定界面。这里要设置好工作空间路径。 软件打开后会看到左侧的project管理窗口。在这个工作空间内的所有project都会在这里显示。 新建工程 点击File-> New -> CCS Project 出现工程设置界面 1选择器件系列,2选择具体器件型号3设置工程名字4指定编译器5指定工程模板 这样一个新的project工程就新建好了。 补充: 1.CCS导入工程,CCS是eclipse结构软件,不能像KEIL软件那样直接打开工程。CSS工程文件只能通过导入的方式打开。在project管理窗口空白处右键 ->import ->CCS project。 浏览找到要打开的工程文件路径即可导入工程,导入工程的界面左下角有一个copy project into workspace 的复选框,勾选上后 导入的project就会复制到你的工作空间中。

  • 2019-04-12
  • 发表了主题帖: 带有 C2000™ 微控制器且精度为 ±0.1° 的分立式旋转变压器前端参考设计

    描述 该参考设计是适用于旋转变压器传感器的励磁放大器和模拟前端。该设计在尺寸大小仅为 1 平方英寸的印刷电路板 (PCB) 上实施分立式组件和标准运算放大器。提供的算法和代码示例使用了 2000™ 微控制器 (MCU) LaunchPad™ 开发套件,通过 TMS320F28069M MCU 来进行信号处理和角度计算。该参考设计使用了创新的散射信号处理方法。该方法将系统精度提高了 250%,同时还将硬件成本和复杂性保持在合理水平。TIDA-01527 是 TIDA-00796 和 TIDA-00363 参考设计的低成本配套设计。这些设计均基于 PGA411-Q1 且能够提供先进的特性,例如保护和诊断特性。 特性 ±0.25° 的角度读取精度,使用创新的散射信号处理方法时精度为 ±0.1° 通过欠采样算法来计算角度 行业标准化组件 在 1 平方英寸的四层 PCB 上进行极简的部署 TMS320F28069M C2000™ MCU 的示例固件(包含源代码) 原理图 设计指南 设计指南

  • 回复了主题帖: 早该变了!值得敬畏的改变,代替RS-485光耦隔离的最新设计

    不错的东西,ISO1500隔离式RS-485收发器

  • 2019-04-06
  • 发表了主题帖: c6747的emifa访问异步外部存储

    当CS4片选信号有效,EMA_A12为1时,74LV139译码电路的1Y1脚将有效,从而启动ADC转换。        AD7656为16位芯片,C6747的EMIFA将其作为16位异步外部存储设备访问。在片选初始化的时候(void CEint()函数),片选4的异步数据总线选择为16位。                 AEMIF_A3CR = 0                                //CE4                     | ( 0 << 31 )           // selectStrobe                | ( 0 << 30 )           // extWait               | ( 15 << 26 )           // writeSetup  //1    //   0 ns               | ( 31 << 20 )           // writeStrobe //4    //  50 ns               | ( 7 << 17 )           // writeHold   //1    //   0 ns               | ( 24 << 13 )           // readSetup   //1    //   0 ns               | ( 24 << 7 )            // readStrobe //20     //  200 ns               | ( 2 << 4 )            // readHold   // 1    //  10 ns                | ( 3 << 2 )            // turnAround    //3  //  10 ns                | ( 1 << 0 );           // asyncSize       // 16-bit bus EMA_A12对应的地址线为A13,故对应的偏移地址应为0x2000h,又因为该偏移地址为以16位数据为单元的半字地址(half word address),故需要转成字节地址,左移一位,为0x4000h,加上基地址0x64000000h,得到使片选4cs4信号有效,EMA_A12为高的地址为0x64004000h。(Uint16 *)0x64004000将0x64004000h转换为Uint16型的指针,*(Uint16 *)0x64004000取出指针所指单元的内容。

  • 发表了主题帖: TMS320VC55xx系列CSL库的方法及必须注意的问题

    在使用CSL库时,当然也有系统的其他库时,仍然必须注意,其中最主要的一点我认为就是在编译时的大模式还有小模式问题。这也是初学者最容易忽略和出错的问题,当然,我也是啦,整整解决了两天。需要注意的问题如下: 1:带X的为大模式库,如rts55x.lib,csl5509ax.lib等。不带X的当然是小模式库啦,如rts55.lib,  csl5509a.lib。 2:打模式库和小模式库不能用混了,如你的工程中包含了一个rts55x.lib的大模式库和一个csl5509a.lib的小模式库,不管你选择大模式编译还是小模式编译,都会出错啦自然。 综上,在配置csl时必须注意用的是大模式还是小模式在决定包含的库路径啦!

最近访客

< 1/5 >

统计信息

已有398人来访过

  • 芯币:4372
  • 好友:--
  • 主题:938
  • 回复:86
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言