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

本文分享了使用TI的C28x系列DSP(28069)进行SCI(Serial Communication Interface)与RS485通讯的经验。通过FIFO轮询的方式实现SCI通讯,避免了简单查询方式带来的CPU资源浪费。针对28069的4级FIFO和ADM2587EBRWZ芯片特性,详细介绍了读写函数的实现,特别是读函数中的延迟对于RS485正常工作的重要性。此外,还包括SCI初始化、波特率设置和RS485功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人使用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 disable


	SciaRegs.SCIHBAUD = 0x10;	//20M  baud 9600   BBR = 0x103   
                                // BBR = LSPCLK/(波特率*8) - 1
	SciaRegs.SCILBAUD = 0x3;

	SciaRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,
    	                            // Disable RX ERR, SLEEP, TXWAKE
	SciaRegs.SCICTL2.all = 0;

	SciaRegs.SCIFFTX.all = 0xE040;


	SciaRegs.SCIFFRX.all = 0x2040;

	SciaRegs.SCIPRI.bit.SOFT = 1;	//Complete current receive/transmit 
          
### DSP28335RS485接口详解 #### RS485通信特性概述 RS485作为一种工业级通信标准,在DSP28335的应用中展现了显著的优势。这种协议具备强大的抗干扰能力、远距离传输性能以及多节点连接的支持,特别适合于复杂的工业环境中的数据交换需求[^1]。 #### 实现RS485通信的关键要素 为了使DSP28335能够通过RS485进行有效的数据收发操作,通常会涉及到硬件配置和软件编程两个方面的工作: - **硬件设置**:需要正确连接RS485电平转换芯片到DSP28335的UART端口上,并确保电源供应稳定可靠。 - **软件实现**:编写相应的驱动程序来初始化串行通信参数(波特率、停止位等),并处理发送/接收的数据流管理逻辑。特别是对于批量数据传输场景下,利用FIFO缓冲区可以有效提高效率,减少CPU占用时间[^2]。 #### 示例代码展示 下面给出一段简单的C语言代码片段用于说明如何在DSP28335平台上启动基于RS485总线的消息传递功能: ```c // 初始化SCI模块为RS485模式 void InitSciForRs485(void){ EALLOW; // 配置SCIA控制寄存器 SciaRegs.SCICCR.bit.PARITY = 0; // No parity (偶校验关闭) SciaRegs.SCICCR.bit.STOPBITS = 0; // One stop bit (一位停止位) SciaRegs.SCICTL1.bit.OVERRUNINTEN = 0;// Overrun interrupt disabled (禁用溢出中断) // 设置波特率为9600 bps SciaRegs.SCIBAUD.all = 0x007A; // 启用接收和发送 SciaRegs.SCICTL1.bit.RXENA = 1; SciaRegs.SCICTL1.bit.TXWAKE = 1; } // 发送字符串函数定义 void SendString(char *str){ while(*str != '\0'){ while(SciaRegs.SCIFFTX.bit.TXFFST!=0); // Wait until space available in TX FIFO (等待直到有空间可用) SciaRegs.SCITXBUF=all=*str++; } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值