您好:
我们用ti的tmsc6748,原先的代码用的串口2做控制一直没有问题。但是新的工程串口2倍占用了,所以换了一个串口1.也是用中断方式,参考串口2的初始化代码。但是仿真发现一直没有进入接收中断。请ti的工程师帮忙看一下问题。
我这里代码如下,在第二段贴出来。
taoyu:
代码贴出来:
int main(void)
{volatile unsigned int delay_11 = 0xFFF;
volatile unsigned short j;// 外设使能配置
PSCInit();GPIOBankPinMuxSet();
GPIOBankPinModeInit();// DSP 中断初始化
InterruptInit();// UART 初始化
UART1Init();
// UART 中断初始化
UART1InterruptInit();
//enable 485IC
//GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_HIGH);while(1)
{
//GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_HIGH);
xf_Delay_50ms();
//UARTCharPut(SOC_UART_1_REGS, '4');//UARTCharPut(SOC_UART_1_REGS, '5');
//UARTCharPut(SOC_UART_1_REGS, '6');
//GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_LOW);
//发送之后 拉低 使485IC处于接收状态
xf_Delay_50ms();}
}
这里是使能psc代码
static void PSCInit(void)
{PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON,
PSC_MDCTL_NEXT_ENABLE);// 使能 UART1 模块
// 对相应外设模块的使能也可以在 BootLoader 中完成
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);}
这里是IO初始化代码
static void GPIOBankPinMuxSet(void)
{CSL_SyscfgRegsOvly sysRegs = (CSL_SyscfgRegsOvly)CSL_SYSCFG_0_REGS;
sysRegs->PINMUX4 &=0x00FFFFFF; //GP1[0] GP1[1] uart1
sysRegs->PINMUX4 |=0x22000000;sysRegs->PINMUX14 &=0xFFFFFF0F; //GP6[6] 485IC enable
sysRegs->PINMUX14 |=0x00000080;}
这里是中断初始化代码
/****************************************************************************/
/* */
/* UART 初始化 */
/* */
/****************************************************************************/
void UART1Init(void)
{
// 配置 UART1 参数
// 波特率 115200 数据位 8 停止位 1 无校验位
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_1_FREQ, BAUD_115200,
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
// 使能 UART1
UARTEnable(SOC_UART_1_REGS);// 使能接收 / 发送 FIFO
UARTFIFOEnable(SOC_UART_1_REGS);// 设置 FIFO 级别
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
}/****************************************************************************/
/* */
/* UART 中断初始化 */
/* */
/****************************************************************************/
void UART1InterruptInit(void)
{IntRegister(C674X_MASK_INT4, UART1Isr);IntEventMap(C674X_MASK_INT4, SYS_INT_UART1_INT);IntEnable(C674X_MASK_INT4);// 使能中断unsigned int intFlags = 0;intFlags |= (UART_INT_LINE_STAT | \UART_INT_TX_EMPTY | \UART_INT_RXDATA_CTI);
UARTIntEnable(SOC_UART_1_REGS, intFlags);
}中断函数是这样写的,我们demo参考的创龙的代码,串口2用于交互用了好几年没有改过。
void UART1Isr()
{
static unsigned int length = 0;
static unsigned int count = 0;
unsigned char rxData = 0;
unsigned int int_id = 0;// 确定中断源
int_id = UARTIntStatus(SOC_UART_1_REGS);// 清除 UART1 系统中断
IntEventClear(SYS_INT_UART1_INT);if (send1_flag != 0)
{
send1_flag = 0;
length = send1_len;//sizeof(txArray1);
count = 0;
}// 发送中断
if(UART_INTID_TX_EMPTY == int_id)
{
if(0 < length)
{
// 写一个字节到 THR
UARTCharPutNonBlocking(SOC_UART_1_REGS, txArray1[count]);
length–;
count++;
}
if(0 == length)
{
// 禁用发送中断
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
}
}// 接收中断
if(UART_INTID_RX_DATA == int_id)
{
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
USART_RxData(rxData);
}// 接收错误
if(UART_INTID_RX_LINE_STAT == int_id)
{
while(UARTRxErrorGet(SOC_UART_1_REGS))
{
// 从 RBR 读一个字节
UARTCharGetNonBlocking(SOC_UART_1_REGS);
}
}return;
}
,
Nancy Wang:
回环测试可以吗?
,
taoyu:
环路测了也是接不到数据,但是把tx接到pc上,用UARTCharPut(SOC_UART_1_REGS, '5');发送,pc能接到数据。
,
Nancy Wang:
UART1配置应该没问题,手动置位IFR看一下能否进中断,看一下中断配置有没有问题。