Dear All:
现在有个项目,用UART。想用UART 的 FIFO模式。FIFO Buffer 是64Bytes,现在我的数据超过了64Bytes,为了减少发送的时间,想用中断的方式向FIFO Buffer里面写数据。现在的问题是,一直中断不正确,一开启UART的发送中断 程序就死掉了。 一直觉得是 中断向量表没有初始化。
想问问AM335X相关中断向量表在哪里初始化的??项目急急急!
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.
Dear All:
现在有个项目,用UART。想用UART 的 FIFO模式。FIFO Buffer 是64Bytes,现在我的数据超过了64Bytes,为了减少发送的时间,想用中断的方式向FIFO Buffer里面写数据。现在的问题是,一直中断不正确,一开启UART的发送中断 程序就死掉了。 一直觉得是 中断向量表没有初始化。
想问问AM335X相关中断向量表在哪里初始化的??项目急急急!
感谢! 是这样配置的,也是照到上面配置的!
现在我想做成,在发送的时候才开发送中断,发送完了关闭中断!发现 UARTIntEnable()这个函数不起作用呢?
UART的FIFO中断配置,要严格按照那个配置流程,否则会出问题。
是那样配置的。现在发现,进中断以后 等 发送完把中断关了,出中断后就开启不到中断了。对开启中断那个函数有点懵!
应该是中断响应后马上关中断,你是不是把中断响应函数修改了?
现在我想做成, 先往FIFO里面装64bytes,开启中断。等这64bytes发送完了,产生中断,在中断里面再装64bytes。
现在发现等没装到64bytes的时候就退出中断了。 有没有一种配置方法在中断中装满64bytes才退出中断,等待这64bytes发完在进中断又装。 现在能发,但是中断次数太多了!
没有64bytes触发的,根据文档,只有8,16,32,56:
Can be written only if EFR[4] = 1.
Sets the trigger level for the TX FIFO: If SCR[6] = 0 and TLR[3] to
TLR[0] not equal to 0000, TX_FIFO_TRIG is not considered.
If SCR[6] = 1, TX_FIFO_TRIG is 2 LSB of the trigger level (1 to 63
on 6 bits) with a granularity of 1.
If SCR[6] = 0 and TLR[3] to TLR[0] = 0000, then:
0h = 8 characters
1h = 16 characters
2h = 32 characters
3h = 56 characters
第二个If。SCR[6] = 1时,不应该是1到63吗? ,中断里面做不做得到连续装值?比如说我配置为56bytes,超过这个值是不是会退出中断?低于这个值会发生中断?
我看TRM的描述,连续装载是DMA触发,中断触发只有那4种。
是不是触发了中断只能在FIFO中装载1byte呢?不可以装多个bytes吗? 如果这样的话中断次数是不是也太多了?
是通过trigger level来控制的,当字节累积到一定程度,触发一次中断。
你仔细看下TRM 的table19-40,应该中断触发level有两种方式,一种是固定字节数的,另一种是可以字节累加的。
我就想配置成,64bytes发完了,再装载64bytes,直到装完为止!该怎么配置?UartFIFOConfigure这个函数该怎么设值?
根据我给你的TRM的介绍,把level设成63试试。
你要看TRM里的寄存器介绍。
设置成63什么时候会触发中断?是FIFO Tx发送到0byte发生中断吗?
我设置过, 我是下面这样设置的:
static void UartFIFOConfigure(unsigned int baseAdd)
{
unsigned int fifoConfig = 0;
//Setting the TX and RX FIFO Trigger levels as 1. No DMA enabled.
fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1,
UART_TRIG_LVL_GRANULARITY_1,
63,
1,
1,
1,
UART_DMA_EN_PATH_SCR,
UART_DMA_MODE_1_ENABLE);
// Configuring the FIFO settings.
UARTFIFOConfig(baseAdd, fifoConfig);
}
这样设置以我的理解是:当FIFO Tx发送到小于等于63Bytes时,会发生中断,然后进入中断只能装载1Bytes。 你看看我的理解对不对?
我就想配置成手册的 Figure 19-6 图一样的!
你有看过TRM的Table 19-11么:
TX FIFO below trigger level (FIFO
enable)
发送FIFO小于level会触发中断。
static void UartFIFOConfigure(unsigned int baseAdd)
{
unsigned int fifoConfig = 0;
//Setting the TX and RX FIFO Trigger levels as 1. No DMA enabled.
fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1,
UART_TRIG_LVL_GRANULARITY_1,
63,
1,
1,
1,
UART_DMA_EN_PATH_SCR,
UART_DMA_MODE_1_ENABLE);
// Configuring the FIFO settings.
UARTFIFOConfig(baseAdd, fifoConfig);
}
是用这个函数配置Level吗? 不管我怎么配置,只有两种现象,1:发送完8bytes产生中断,2:发送完1byte产生中断。是不是还要用别的函数配置呢?
用UartFIFOConfig 函数,不管怎么改都没有变化呢?都是低于56bytes就产生中断了。我希望低于1byte或者8bytes才产生中断!该怎么配置?还要改写哪里吗?
初始化完成后,建议检查下TLR,SCR,FCR寄存器中实际值是不是如期望的那样。
UART中断的trigger level由如下几个配置决定:
SCR[6]选择TX Trigger 颗粒度是1还是其他,如果设置为1,那么颗粒度是1,此时TLR[0~3]需要和FCR[5~4]组合成1个6bits的位域,来表征0~63字节
SCR[6]如果设置为0,若TLR[0~3]为0,则trigger level由FCR[5~4]确定,分别为8,16,32,56字节,
若TLR[0~3]为非0,则trigger level 由TLR[0~3]确定,颗粒度为4字节。
我用的是AM335X_StarterWare_02_00_00_06 库里面的函数配置的啊? 用的是Demo里面一样的函数配置的啊? 不管怎么配置产生中断 要么是1byte 要么是8bytes。
static void UartFIFOConfigure(unsigned int baseAdd){
unsigned int fifoConfig = 0;
//Setting the TX and RX FIFO Trigger levels as 1. No DMA enabled.
fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1,
UART_TRIG_LVL_GRANULARITY_1, 1, 1, 1, 1, UART_DMA_EN_PATH_SCR, UART_DMA_MODE_1_ENABLE);
// Configuring the FIFO settings.
UARTFIFOConfig(baseAdd, fifoConfig);
} 就用的这个函数!