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.

[参考译文] CCS/TMS320C5505:C5505-ezdsp5505-UART 和 SPI 不能协同工作

Guru**** 2585275 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/634396/ccs-tms320c5505-c5505--ezdsp5505---uart-and-spi-can-not-work-together

器件型号:TMS320C5505
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

尊敬的所有人:

      大家好、我使用了 C5505-开发板 eZdsp-USB、现在调试 SPI 遇到了以下问题:

     1、单独调试 SPI、时钟波形正常。

    2、加上 UART 串行端口程序、SPI 工作正常、但 UART 没有数据输出。

     3、移除 SPI、单独 UART、UART 正常工作。

我不知道配置的错误位置。 当 UART 和 SPI 协同工作时、UART 不工作。

void spirom_init()
{
/*启用 SPI */
SYS_EXBUSSEL =(SYS_EXBUSSEL 和0x0fff)| 0x1000;
SYS_PRCNTR = 0x04;
SYS_PRCNTRLR = 0x0080;

/* SPI 时钟控制*/
SPI_SPICC2 = 0x0000;// SPI 时钟被禁用
SPI_SPICC1 = 0x00b0;// 12MHz 输入时钟除以120


SPI_SPIDC1 = 0x0000;// SPI0低空闲时钟、低电平有效 CS、在上升时钟上移出、无时钟延迟
SPI_SPIDC2 = 0x0000;

SPI_SPICC2 = 0x8000;//启用 SPI 时钟
}




void UART_txIsr ()
{
if (i_timeeee < 7)
{
i_timeeeeeeeeee++;
UART_WRITE (hUart、&Rx_MCU[I_TIMEE]、I_TIMEee、1000);
//USBSTK5505_waitusec( 100);
}

UART_eventEnable (hUart、CSL_UART_XMIOR_REG_EMPT_INTERRUPT);
//
}





CSL_UartSetup mySetup =
{
//输入时钟频率,单位为 MHz */
98304000、
/*波特率*/
9600、
/*字长8 */
CSL_UART_WORD8、
/*生成1个停止位*
1、
/*禁用奇偶校验*/
CSL_UART_DISABLE_奇 偶校验,
/*禁用 FIFO */
CSL_UART_FIFO_DISABLE、
/*启用触发器14 FIFO *//
CSL_UART_FIFO_DMA1_DISABLE_TRIG14,
//回送启用*/
CSL_UART_NO_LOOP回 送,
/**无自动流控制*/CSL_UART_NO_AFE
,
//无 RTS





*/ CSL_UART_NOT_INT_UINT16,
//
UART_INIT (uartObj、CSL_UART_INST_0、UART_polled);
hUart =(CSL_UartHandle)(uartObj);
/*使用设置结构配置 UART 寄存器*/
UART_setup (hUart、&mySetup);

/*循环计数器和错误标志*/
状态= UART_INIT (&uartObj、CSL_UART_INST_0、UART_INTERRUPT);
if (CSL_SOK!=状态)
{
printf ("UART_init 失败错误代码%d\n"、status);
返回状态;
}

/**已创建句柄*/
hUart =(CSL_UartHandle)(uartObj);

/*使用设置结构配置 UART 寄存器*/
状态= UART_setup (hUart、&mySetup);
if (CSL_SOK!=状态)
{
printf ("UART_setup 失败错误代码%d\n"、status);
返回状态;
}

isrAddr.rbiAddr = UART_rxIsr;
isrAddr.tbeiAddr = UART_txIsr;
isrAddr.ctoi = UART_ctoIsr;
isrAddr.lsiAddr = UART_lsiIsr;
IRQ_CLEAR (UART_EVENT);
IRQ_setVecs ((uint32)(&VECSTART));
/*配置中断*/
IRQ_plug (UART_EVENT、&UART_INTERDispatch);
/*启用中断*/
IRQ_ENABLE (UART_EVENT);
IRQ_globalEnable();

UART_setCallback (hUart、isrAddr);
状态= UART_eventEnable (hUart、CSL_UART_XMIOR_REG_EMPT_INTERRUPT);
状态= UART_eventEnable (hUart、CSL_UART_RECVOR_REG_DATA_INTERRUPT);
STATUS = UART_eventEnable (hUart、CSL_UART_RECVOR_LINE_STATUS_INTERRUPT);

返回0;

}


中断空 UART_INTERDispatch (void)
{
uint16 EventID = 0;

IRQ_DISABLE (UART_EVENT);

/*获取导致中断的事件 ID */
EventID = UART_getEventId (hUart);

if (((void (*)(void))(hUart->UART_isrDispatchTable[EventID])))
{
(((void (*)(void))(hUart->UART_isrDispatchTable[EventID]));
}

IRQ_ENABLE (UART_EVENT);

返回;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    出于某种原因,我也看到了这一点,我们所做的就是使用正确的参数和句柄初始化 UART:

    UART_INIT (uartObj、CSL_UART_INST_0、UART_INTERRUPT);

    //已创建句柄
    hUart =(CSL_UartHandle)(uartObj);

    //使用设置结构配置 UART 寄存器
    状态= UART_setup (hUart、&mySetup);

    isrAddr.rbiAddr =UART_rxIsr;
    isrAddr.tbeiAddr = UART_txIsr;
    isrAddr.ctoi = UART_ctoIsr;
    isrAddr.lsiAddr = UART_lsiIsr;

    UART_setCallback (hUart、isrAddr);
    状态= UART_eventEnable (hUart、CSL_UART_XMIOR_REG_EMPT_INTERRUPT);
    状态= UART_eventEnable (hUart、CSL_UART_RECVOR_REG_DATA_INTERRUPT);

    等等

    然后设置 SPI 总线,在我们需要实际使用 UART 之前,我们只使用几个参数(bAUD_RATE 除数、PWREMU_Mgmt、IER、FCR 和 LCR)重新配置 UART,然后所有这些参数都照常工作... 不知道为什么这似乎对我们、也许对您来说是有效的。 在 SysBIOS 开始之前,我们只在 main()中执行一次此操作。 (您的配置和值可能不同)

    谢谢、MM