This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
项目是通过sci控制pwm,烧录成功后能脱机运行,现想将串口通信方式从usb改为usb转rs232方式连接GPIO8和GPIO9,烧录成功后通讯未能成功。
项目中代码只将
GPIO_SetupPinMux(42, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(42, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(43, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(43, GPIO_INPUT, GPIO_ASYNC);
改成了
GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);
RS232自检过没有问题,请问为什么行不通呢?
你好,
RS232自检过没有问题
您是如何自检的?是不是通过CCS查看SCI相关寄存器看数据是否成功接收等等。
然后还有个问题是烧录成功后上电不能运行全部代码
您是如何知道这一点的?代码在哪里停止了? 您是如何烧录程序的?
你好,部分代码见此,烧录上电后只跑到 for循环的if语句之外,也就是进不去if语句。
烧录是将2837xD_RAM_lnk_cpu1.cmd改成了2837xD_FLASH_lnk_cpu1.cmd 然后选择CPU1-FLASH,之后debug自动烧录成功.上电powrupreset成功后代码运行正常。
#include "F28x_Project.h"
//Funktionen Initialisieren
interrupt void SCI_B_SR(void);
void SciGpioInitial (void);
void SciInterruptInitial(void);
void SciInitial(void);
void SciWrite(Uint16 a);
void LaunchxlRun(Uint16 a);
void LEDkontroller(Uint16 DutyR,Uint16 DutyG,Uint16 DutyB,Uint16 Frequenz);
void LEDfade(Uint16 R,Uint16 G,Uint16 B,Uint16 Geschwindigkeit);
void fade(int R,int G,int B,Uint16 Geschwindigkeit);
void Maschinefehler(Uint16 Fehlernummer,Uint16 Fehlerstatus);
void Aus();
void delay();
Uint16 com[5];
int i=0;
int j=0;
void main(void)
{
//System einstellen, Interrupt enable, das muss man in Main-Funktion schreiben.
InitSysCtrl();
InitGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
SciInitial();
EINT;
for(;;)
{
if(i==5)
{
LaunchxlRun(com[j]);
}
}//ewig Laufendes Programm
}
interrupt void SCI_A_SR(void)//gleich wie Interrupt SCIA_RX_INT
{
if(i>=5)
{
i=0;
}
Uint16 ReceivedChar = SciaRegs.SCIRXBUF.all;
com[i]=ReceivedChar;//jedesmal 8 bits 00-ff in com speichern.
SciWrite(com[i]);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
i++;
}
void SciGpioInitial(void)
{
//USB DEBUG
GPIO_SetupPinMux(42, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(42, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(43, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(43, GPIO_INPUT, GPIO_ASYNC);
/* //GPIO8->SCITXDA output
GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
//GPIO9->SCIRXDA input
GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);*/
}
void SciInterruptInitial(void)
{
//Interrupt benutzten:
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
EALLOW;
PieVectTable.SCIA_RX_INT = &SCI_A_SR;
//Interruptfunktion SCIA_RX_INT als was ich gewuecht habe wechseln.
EDIS;//Setzt EALLOW wieder null.
IER |= PIEACK_GROUP9;//laut Pie Channel Mapping soll Intterupt Gruppe 9 aktiv sein.
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//PIE enable,PIE Innere Interruptgruppe.
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//SCIB_RX Interrupt enable
}
void SciInitial(void)//Baurate, Stopbits und Parity von Serieller Kommunikation einstellen
{
SciGpioInitial();
SciInterruptInitial();
SciaRegs.SCICTL1.all = 0x0003;
//SciaRegs.SCICCR.bit.STOPBITS = 0; //0:ein Stopbit;1:zwei Stopbits.
//SciaRegs.SCICCR.bit.PARITYENA = 0;//Kein Parity noetig
//SciaRegs.SCICCR.bit.SCICHAR = 0x7;//0x0-0x7 zeigt,dass es in jedem Paket 8 Bit gibt.
//die 3 sind gleich wie:
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 0x0036;//Bautrate als 115200 einstellen
SciaRegs.SCICTL1.all = 0x0023;
//RXENA,TXENA,SWRESET enable
}
void SciWrite(Uint16 a)
{
while (SciaRegs.SCICTL2.bit.TXRDY != 1) {}// wenn TX nicht ready ist, do nothing.
SciaRegs.SCITXBUF.all =a;
}
你好,这可能与你代码放置的位置有关,如果您将代码烧录进flash,那么当设备启动时,它需要“从flash执行”,所以我认为会在reset设备后有效。
我没太理解您说的是什么意思?目前这段代码有两个问题,第一就是将Gpio42和43换成8和9就无法实现sci.通信,第二是烧录进flash后重新上电必须按reset后才能运行。
第一就是将Gpio42和43换成8和9就无法实现sci.通信
如果您发送某些内容、您会在 SCI 寄存器/引脚(使用示波器)中看到它吗?
第二是烧录进flash后重新上电必须按reset后才能运行。
烧录后代码停在哪了?你可以在CCS中暂停程序的执行并检查程序计数器吗?您可以通过将‘PC’添加到expression窗口来执行此操作。之后、您可以检查此地址在 cmd 文件内被定义的位置。
我刚刚尝试了一下在ram里debug,发现i的初始值为3,也就是说一开始SCIRX的中断就触发了三次
已反馈给工程师。
我刚刚尝试了一下在ram里debug,发现i的初始值为3,也就是说一开始SCIRX的中断就触发了三次
你期望看到的是什么?中断触发说明数据被接收。