大家好,
有个问题请教下。SCI发送中断时,代码如下:
#define TSIZE1 10 uint8_t TEXT1[TSIZE1]= {'H','E','R','C','U','L','E','S',' ',' '}; /* USER CODE END */ void main(void) { /* USER CODE BEGIN (3) */ sciInit(); _enable_IRQ(); sciSend(scilinREG,TSIZE1,TEXT1); while(1); /* USER CODE END */ } /* USER CODE BEGIN (4) */ void sciNotification(sciBASE_t *sci, uint32 flags) {while(1) { sciSend(scilinREG, 21, (unsigned char *)"Please press a key!\r\n"); } }
通过串口发送出来之后显示HERCULES PPPP。。。。。然后后面就是许多P了,为什么sciNotification函数里的Please press a key!只发送一个字符了呢,不明白。
Ray11:
回复 Ken Wang:
Ken,
谢谢你的耐心解答!感谢TI提供这样一个良好的交流平台!希望大家都能够多多交流~
user1317437:
回复 Ken Wang:
Ken,
你好,我在关于SCI/LIN模块SCI中断模式发送时,采用Multi-Buffer Mode的使用遇到一些问题,向你请教一下。我使用的是RM48HDK,MCU是RM48L952,中断模式下Single-Buffer Mode发送是可以的,但是每发送一个字节就重新进入一次中断,觉得这样效率太低,所以想要采用Multi-Buffer Mode,我的主程序以及SCI.c中程序修改如下,但是不成功,连中断都不能进,不知道是什么原因。(程序见附件)
sciInit(); _enable_IRQ(); sciEnableNotification(scilinREG,SCI_TX_INT); sciEnableNotification(scilinREG,SCI_RX_INT); sciSend(scilinREG,sizeof(mydata),(unsigned char*)mydata); while(1);
==================================================
#include "lin.h"
scilinREG->GCR1 = (1 << 25) /* enable transmit */ | (1 << 24) /* enable receive */ | (1 << 10) /* enable multi-buffer */ | (1 << 5) /* internal clock (device has no clock pin) */ | ((2-1) << 4) /* number of stop bits */ | (0 << 3) /* even parity, otherwise odd */ | (0 << 2) /* enable parity */ | (1 << 1); /* asynchronous timing mode */
void linHighLevelInterrupt(void)
case 12: /* transmit */ //if(–g_sciTransfer[1].length > 0) // { // scilinREG->TD = *g_sciTransfer[1].data++; // }
if (–g_sciTransfer[1].length > 0) { //scilinREG->TD = *g_sciTransfer[1].data++; length = g_sciTransfer[1].length; *pData = *g_sciTransfer[1].data + length;
for (i = length; i >= 0; i–) { linREG->TDx[i] = *pData–; }
} else { scilinREG->CLRINT = SCI_TX_INT; sciNotification(scilinREG, SCI_TX_INT); }
break;
Ken Wang:
回复 user1317437:
Jianan,
Multi-buffer模式只适用于以SCI/LIN模块的LIN模式,如果是工作在SCI模式下面,它只有TX和RX两个单字节的buffer。
如果你需要传输大量的数据,然后不是一个字节就产生中断的话,建议你可以考虑用UART+DMA的方法,或是采用multi-buffer的SPI接口试试。
谢谢
user1317437:
回复 Ken Wang:
但是根据手册(RM48x 16/32-Bit RISC Flash Microcontroller Technical Reference Manual)第25部分Serial Communication Interface (SCI)/Local Interconnect/Network (LIN) Module,25.5.2部分SCI发送是有两种模式的。25.5.2.2 Transmitting Data in Multi-Buffer Mode 部分有详细的描述Multi-Buffer Mode is selected when MBUF MODE bit is 1. Similar to Single Buffer Mode the software can use polling, Interrupt or DMA method to write the data to be transmitted. The data to be transmitted has to be written to LINTD0 and LINTD1 register, based on the number of bytes. SCI waits for data to be written to Byte 0(TD0) of LINTD0 register and transfers the programmed number of bytes to SCITXSHF to transmit one by one automatically.
Ken Wang:
回复 user1317437:
Jiannan,
根据上面的描述,你也可以知道,如果要使用multi-buffer模式的话,需要把数据写到LINTDx的寄存器里面,这个是给LIN总线模式用的,不是UART模式的。
UART确实不支持多缓存的模式,因为UART本身的传输速率就不高,buffer的模式作用不是很大。
谢谢