TI的工程师 你好 想询问下 z-stack 下485的应用(大神们求解)
你好
先开始 我在 z-stack 預設使用DMA 方式,baudRate 设置为9600 应用P1_2 做485的控制线 串口线 还是 P0_2 P0_3
在发生数据的时候调用HalUARTWrite()函数 前设置 P1_2 = 1; 启动一个任务osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT6,100);延迟一定时间后设置 P1_2 = 0 能完成 485的收发控制 但是这样就得要求485的另一端 在接受都数据后延迟一定的时候后发送出来的数据才能收到 ;
后来我想 在DMA发送完成后设置 P1_2 = 0; 但是485就是不通
static void HalUARTPollDMA(void)
{
.....................
if (dmaCfg.txDMAPending && !dmaCfg.txShdwValid)
{
// UART TX DMA is expected to be fired and enough time has lapsed since last DMA ISR
// to know that DBUF can be overwritten
halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX);
halIntState_t intState;
// Clear the DMA pending flag
dmaCfg.txDMAPending = FALSE;
HAL_DMA_SET_SOURCE(ch, dmaCfg.txBuf[dmaCfg.txSel]);
HAL_DMA_SET_LEN(ch, dmaCfg.txIdx[dmaCfg.txSel]);
dmaCfg.txSel ^= 1;
HAL_ENTER_CRITICAL_SECTION(intState);
HAL_DMA_ARM_CH(HAL_DMA_CH_TX);
do
{
asm("NOP");
} while (!HAL_DMA_CH_ARMED(HAL_DMA_CH_TX));
HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX);
HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX);
HAL_EXIT_CRITICAL_SECTION(intState);
P1DIR |= 0x04;P1_2 = 0;
}
...............
}
在这里判断的DMA发生完成 不知道对不对? 是不是这个地方判断? 如果不是在这里判断 DMA 发生完成的请告诉下我在哪里设置P1_2 = 0来控制485为接受的时候才能控制好485的收发。
不要在程序里面做等待,do()while(1).
当完成的时候直接产生中断,在中断里面把标志位清楚掉。
什么时候完成中断?
do
{
asm("NOP");
} while (!HAL_DMA_CH_ARMED(HAL_DMA_CH_TX));
这就表示完成了中断吗?
do
{
asm("NOP");
} while (!HAL_DMA_CH_ARMED(HAL_DMA_CH_TX));
HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX);
HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX);
HAL_EXIT_CRITICAL_SECTION(intState);
P1DIR |= 0x04;P1_2 = 0; 我在这添加了485控制引脚为接受但是不行 我的 数据发送不成功
你的设置和IO口的输出正常么?
正常的 用示波器打过高低电平控制完全正常
怎么一个星期都没有人回我问题了?能出来一个人解答下吗
http://e2e.ti.com/support/wireless_connectivity/f/158/t/85122.aspx 希望对你有帮助