本人使用SCI的通讯经历也不多,仅仅是用于DSP与威纶通公司的触摸屏进行过简单的通讯,通讯方式为RS485,通讯协议为ModbusRTU。

说到SCI,一开始我弄这个的时候,也不懂,网上看了很多资料,但也没有特别合适的,我现在公司的DSP的代码架构,都是一个主中断,一个主循环,一个1ms定时器中断,所以通讯函数,要么放主循环或1ms中断中运行,不会为SCI单独弄个中断,但我这边也不想用《手把手教你学DSP--基于TMS320X281x》上描述的简单SCI查询方式通讯,因为这种方法FIFO没有用,会造成对CPU资源的浪费。

所以我现在提的SCI通讯方式是基于FIFO的轮询方式,以这种方式来配置寄存器,从而形成的读写函数。但28069的SCI的FIFO只有4级,28377D的FIFO有16级。RS485是读写是不能够同时进行的,具体特点,可以百度,这跟RS232不相同。RS485的读写函数是基于ADM2587EBRWZ芯片而写,除了SCI的RX与TX引脚,还多了一个DIR引脚,DIR引脚为高,SCI能够发送数据,反之,读取数据。

代码:

  • SCI的初始化;
void InitScia(void)  // LSPCLK =  SYSCLKOUT/4  = 20Mhz
{SciaRegs.SCICCR.all = 0x07;   //1 stopbit,no parity,//idle line mode,loopback test disableSciaRegs.SCIHBAUD = 0x10;  //20M  baud 9600   BBR = 0x103   // BBR = LSPCLK/(波特率*8) - 1SciaRegs.SCILBAUD = 0x3;SciaRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all = 0;SciaRegs.SCIFFTX.all = 0xE040;SciaRegs.SCIFFRX.all = 0x2040;SciaRegs.SCIPRI.bit.SOFT = 1;    //Complete current receive/transmit //sequence before stoppingSciaRegs.SCIPRI.bit.FREE = 0;SciaRegs.SCICTL1.bit.SWRESET = 1;
}void InitScib(void)
{ScibRegs.SCICCR.all = 0x07;   //1 stopbit,no parity,//idle line mode,loopback test disableScibRegs.SCIHBAUD = 0x10;  //20M  baud 9600   BBR = 0x103  //BBR = LSPCLK/(波特率*8) - 1ScibRegs.SCILBAUD = 0x3;ScibRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKEScibRegs.SCICTL2.all = 0;ScibRegs.SCIFFTX.all = 0xE040;ScibRegs.SCIFFRX.all = 0x2040;ScibRegs.SCIPRI.bit.SOFT = 1;  //Complete current receive/transmit// sequence before stoppingScibRegs.SCIPRI.bit.FREE = 0;ScibRegs.SCICTL1.bit.SWRESET = 1;
}void InitScibGpio(void)
{EALLOW;GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;     // Enable pull-up for GPIO22 (SCITXDB)GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0;     // Enable pull-up for GPIO23 (SCIRXDB)GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;   // Asynch qual for GPIO23 (SCIRXDB)GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 3;    // Configure GPIO22 for SCITXDB operationGpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3;    // Configure GPIO23 for SCIRXDB operationEDIS;
}
  • SCI的读写及复位函数;

复位函数:

void SciReset(Uchar dev)
{volatile struct SCI_REGS *p;switch(dev){case Sci_a:p = &SciaRegs;break;case Sci_b:p = &ScibRegs;break;default:p = &SciaRegs;break;}if(  p->SCIRXST.bit.RXERROR || p->SCIRXST.bit.FE || p->SCIRXST.bit.PE || p->SCIRXST.bit.OE )  {p->SCICTL1.bit.SWRESET = 0;DELAY_US(100);p->SCICTL1.bit.SWRESET = 1;}
}

写函数:


Uint16 WriteSci(Uchar dev,char *buf,Uint16 cnt)
{static Uint16 i,Num;volatile struct SCI_REGS *p;switch(dev){case Sci_a:p = &SciaRegs;break;case Sci_b:p = &ScibRegs;break;default:p = &SciaRegs;break;}i=0;Num = cnt;SciReset_C1062(dev);while(p->SCIFFTX.bit.TXFFST != 0);p->SCICTL1.bit.TXWAKE = 1;p->SCITXBUF = 0xAA;while(i < Num){while(p->SCIFFTX.bit.TXFFST >= 4);p->SCITXBUF = buf[i++];}return(i);
}

读函数:

读函数这里有个DELAY_US(3800),这个非常重要,没有这个延时RS485没法正常的读取数据,至于原理,暂时我也没完全搞清楚,应该是为了度过发送数据的而产生的低电平吧,因为DIR引脚为高时,ADM2587EBRWZ芯片的引脚会把SCI的Rx引脚拉低,如果这段时间SCIRX引脚读数据会读到错误的数据,因为SCI的Rx引脚读取数据时,认为8个时钟周期的低电平就是一个有效的数据起始位,这个读函数完全时为了RS485而准备的,我也试过RS232,当使用RS232时,SCI的收发是互不干扰,就没有这个问题。

Uint16 ReadSci(Uchar dev,char *buf)
{static Uint16 i;volatile struct SCI_REGS *p;switch(dev){case Sci_a:p = &SciaRegs;break;case Sci_b:p = &ScibRegs;break;default:p = &SciaRegs;break;}SciReset_C1062(dev);if(p->SCIFFRX.bit.RXFFST == 0){return(0);}i = 0;do{while(p->SCIFFRX.bit.RXFFST != 0){buf[i] = p->SCIRXBUF.bit.RXDT;i ++;}DELAY_US(3800);}while(p->SCIFFRX.bit.RXFFST  != 0);return(i);
}

忙函数:

void BusyWaitingSci(Uchar dev)
{volatile struct SCI_REGS *p;switch(dev){case Sci_a:p = &SciaRegs;break;case Sci_b:p = &ScibRegs;break;default:p = &SciaRegs;break;}while(p->SCIFFTX.bit.TXFFST > 0);
}

波特率设置函数:

void SetBaudrateSci(Uchar dev,Uint32 baud)
{Uint32 rate;volatile struct SCI_REGS *p;switch(dev){case Sci_a:p = &SciaRegs;break;case Sci_b:p = &ScibRegs;break;default:p = &SciaRegs;break;}rate = 20000000 / (baud*8) - 1;p->SCIHBAUD = rate >> 8;   //20M  baud 9600 2603p->SCILBAUD = rate & 0x0FF;
}
  • RS485函数;

写函数:

void Rs485Write(char *buf,Uint32 Baudrate,Uint16 cnt)
{float ByteDelay;ByteDelay = (1000000 / Baudrate ) * 11;RcvDisable();DELAY_US(10);ADM2587_Write(buf,cnt);ADM2587_BusyWaiting();DELAY_US(ByteDelay);RcvEnable();
}

读函数:

Uint16 Rs485Read(char *buf)
{RcvEnable();DELAY_US(10);return(ADM2587_Read(buf));
}

头文件:


#define ADM2587_Write(buf,cnt)      WriteSci(Sci_b,buf,cnt)
#define ADM2587_Read(buf)       ReadSci(Sci_b,buf)
#define ADM2587_BusyWaiting()       BusyWaitingSci(Sci_b)
#define ADM2587_BaudrateSet(baud)   SetBaudrateSci(Sci_b,baud)#define RcvDisable()    GpioDataRegs.GPBSET.bit.GPIO50  = 1
#define RcvEnable()     GpioDataRegs.GPBCLEAR.bit.GPIO50  = 1

Ti的C28x系列的DSP(28069)使用经验,SCI与RS485(ADM2587EBRWZ)相关推荐

  1. Ti的C28x系列的DSP使用经验,如何整合DSP中运行的函数。

    我从事Ti的C28x系列的DSP的开发时间不长,短短一年,使用过两种架构的DSP,主要针对资源管理有一些自己的心得. 在工程文件的分布上,本人认为需要DSP运行的的代码应该放在一个.C文件中管理,这样 ...

  2. Ti的C28x系列的DSP(28069)使用经验,I2C与EEPROM(AT24C256C)

    本人正式使用I2C的经历只有一次,使用EEPROM是为了实现DSP的RAM中的变量断电后仍不会丢失的目的.这可能不是一个恰当的比喻.下面我来详细描述EEPROM的过程. 项目中使用的EEPROM的型号 ...

  3. Ti的C28x系列的DSP(28069)(28377)使用经验,ADC经验

    笔者使用过的项目中,使用的ADC都是DSP的片内ADC,使用片内ADC的好处是,转换速度快,节约成本,这是相比片外ADC的优势. DSP_28069的ADC精度是12位,DSP_28377D的ADC精 ...

  4. TI的C28x系列芯片的存储结构(1)——总括

    C28x内核为哈佛结构,程序储存和数据储存分开,使用32位数据地址和22位程序地址.这样总地址可以达到:在数据空间中存储4G个字(1个字= 16位),在程序空间中存储4M个字.C28x的程序和数据空间 ...

  5. 二、TI毫米波雷达系列——IWR6843 DSP系统内存结构

    DSP系统结构: 1)IWR6843的DSS的核心是600MHz的C674xDSP核,客户可以编程运行雷达信号处理算法.DSP本地有两级内存(L1和L2).L1(32KBL1D.32KBL1P)以60 ...

  6. TI的C28x系列芯片的存储结构(2)——CLA的RAM

    CLA有自己的程序和数据总线,它的RAM存储区分三种:程序RAM(program RAM).数据RAM(data RAM)和信号RAM(message RAM). ①program RAM CLA的程 ...

  7. [解疑][TI]TI毫米波雷达系列(一):Texas Instruments德州仪器 相关软件安装及使用时问题汇总,持续更新......

    德州仪器 (Texas Instruments),简称TI,是全球领先的半导体公司,为现实世界的信号处理提供创新的数字信号处理(DSP)及模拟器件技术.除半导体业务外,还提供包括传感与控制.教育产品和 ...

  8. 基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)的开发板

    开发板简介 基于TI AM5728浮点双DSP C66x +双ARM Cortex-A15工业控制及高性能音视频处理器: 多核异构CPU,集成双核Cortex-A15.双核C66x浮点DSP.双核PR ...

  9. 信迈TI OMAP-L138(定点/浮点DSP C674x+ARM9) + Xilinx Spartan-6 FPGA开发板规格书

    1 评估板简介 基于TI OMAP-L138(定点/浮点 DSP C674x+ARM9)+ Xilinx Spartan-6 FPGA处理器: OMAP-L138 FPGA 通过uPP.EMIFA.I ...

  10. 三菱FX5U系列PLC与三菱D700变频器进行RS485通信的具体方法和步骤

    三菱FX5U系列PLC与三菱D700变频器进行RS485通信的具体方法和步骤 以RS-485通信方式连接FX5U系列PLC与三菱变频器,最多可对16台变频器进行运行控制.各种指令以及参数的读出/写入. ...

最新文章

  1. ecside使用笔记(1)
  2. python爬虫详细步骤-Python爬虫的步骤和工具
  3. C语言程序设计之回调函数实现方法
  4. linux网卡入流速,linux下简单限制网卡速度与
  5. SpringMVC拦截器-用户登录权限控制代码实现3
  6. dw新建php文件自动生成html,dw如何新建css规则
  7. web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)
  8. opencv3.2.0实现视频抽帧,并保存成图片
  9. 按方位提取高程数据的方法
  10. Activity 设置SingleTask模式,当栈中已有Activity实例时的生命周期
  11. css中 =是什么意思,CSS中link什么意思
  12. 参观微软亚洲研究院有感
  13. EDM初级:什么是EDM邮件营销?EDM营销的定义
  14. 史上绝地反击,美式英语英文学习大全。美国英语最新词频表
  15. 一个纯技术程序员的求职心酸历程
  16. mysql 1701,MySQL ERROR 1701 (42000)
  17. 网易宝系统架构之我见:高可用篇
  18. 斩波稳定(自稳零)精密运算放大器
  19. cs231n:assignment2——Q1: Fully-connected Neural Network
  20. signature=0cbbef017ab45816d9cb00aab39ea9bf,乳腺癌术后伴发胃非霍奇金淋巴瘤一例报告

热门文章

  1. linux wifi问题,Ubuntu下wifi问题解决
  2. TextpatternCMS安装插件时可以安装后门导致getshell
  3. FC网络光纤通信 c语言实现,[2018年最新整理]光纤通信实验指导书(含原理).doc
  4. 数学分析教程(科大)——1.9笔记+习题
  5. 京东金融以应用为中心的DevOps体系建设(附PPT)
  6. project安装教程/包
  7. PHP连接mysql原生代码
  8. MYSQL攻击全攻略
  9. 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(下)
  10. WPS与Office的恩怨情仇,这6个电脑冷知识,你知道几个?