📄 tms320vc5416与tlc16c554的接口函数.c
字号:
}
} // if ((uiTemp & 0x60)) // 移位寄存器或发送寄存器空否 D6 D5
else
break; // 发送寄存器不空,无法继续发送
} while(TRUE);
// 若还有数据等待发送,在上一级函数启动串口中断,以提高代码效率
if (uiComTempSendBytePtr[uiComNoIntNmi])
return;
else // 串口临时发送缓冲内容发送完毕,检查扩展RAM中是否有数据
{
// 从实际串口发送缓冲中读取数据到指定的低端RAM缓冲;
if (uiComRealSendWordUse[uiComNoIntNmi] != uiComRealSendWordPtr[uiComNoIntNmi]) // 实际缓冲中数据有效
{
// 从实际串口发送缓冲中读取数据到指定的低端RAM缓冲;
uiComTempSendBytePtr[uiComNoIntNmi] = uiReadDataExtComTxd(uiComNoIntNmi, uiLowComTxd[uiComNoIntNmi], cnComTmpSendBufWordSize); // 需要发给串口的数据
uiComTempSendBytePtr[uiComNoIntNmi] = uiComTempSendBytePtr[uiComNoIntNmi] << 1; // 字 = 2字节
}
uiComTempSendByteUse[uiComNoIntNmi] = 0;
}
}
// INT0:第一、三片串口芯片中断使用DSP的INT0, 1、 2、 3、 4、 9、10、11、12;
interrupt void ivInt0Function()
{
UINT uiTotalComThisTime; // 用于防止串口数不同,错误的中断可能导致程序运行错误
//////////////////
// 中断函数主体 //
//////////////////
blIntr0NeedToBeActive = FALSE; // 主程序有必要启动一次INTR0;每次收到网络数据,均应置此标志,
// INT0:第一、三片串口芯片中断使用DSP的INT0, 1、 2、 3、 4、 9、10、11、12;
// if (cnMaxComThisType < 1) return; // 本类型的最大串口数 // 装置最少为8路
uiInINT0_1_2 = 0xff00; // 在INT0服务中
// 串口芯片中断标识位读取地址:
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应INTA1、INTB1、INTC1、INTD1、INTA3、INTB3、INTC3、INTD3;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应INTA2、INTB2、INTC2、INTD2、INTA4、INTB4、INTC4、INTD4;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应INTA5、INTB5、INTC5、INTD5、INTA7、INTB7、INTC7、INTD7;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0-D8分别对应INTA6、INTB6、INTC6、INTD6、INTA8、INTB8、INTC8、INTD8;
//
// 用通道号表示
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应 1、 2、 3、 4、 9、10、11、12;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应 5、 6、 7、 8、13、14、15、16;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应17、18、19、20、25、26、27、28;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0-D8分别对应21、22、23、24、29、30、31、32;
// 具体查询是那路串口有中断发生
// ----------------------------
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应 1、 2、 3、 4、 9、10、11、12;
port500 = 0x00;
uiInterruptFlagINT0_1_2 = port600; // 读取8位串口中断位标志
// TL16c554路选方法
// ================
// 端口地址 D0 D1 D2 D3 D4 D5 D6 D7
// -------- ---- ---- ---- ---- ---- ---- ---- ----
// INT0: 200H CSA1 CSB1 CSC1 CSD1 CSA3 CSB3 CSC3 CSD3
// INT1: 300H CSA5 CSB5 CSC5 CSD5 CSA7 CSB7 CSC7 CSD7
// INT2: 700H CSA2 CSB2 CSC2 CSD2 CSA4 CSB4 CSC4 CSD4
// Nmi: 900H CSA6 CSB6 CSC6 CSD6 CSA8 CSB8 CSC8 CSD8
//
// 用通道号表示
// INT0: 200H 1 2 3 4 9 10 11 12
// INT1: 300H 17 18 19 20 25 26 27 28
// INT2: 700H 5 6 7 8 13 14 15 16
// Nmi: 900H 21 22 23 24 29 30 31 32
//
// INT0:1 2 3 4 9 10 11 12
// --------------------------------------------------
// 如要选择第 1路port900 = 0xff, port700 = 0xff, port300 = 0xff, port200 = 0xfe;
// 如要选择第 9路port900 = 0xff, port700 = 0xff, port300 = 0xff, port200 = 0xef;
//
// INT1:17 18 19 20 25 26 27 28
// ---------------------------------------------------
// 如要选择第17路port900 = 0xff, port700 = 0xff, port300 = 0xfe, port200 = 0xff;
// 如要选择第25路port900 = 0xff, port700 = 0xff, port300 = 0xef, port200 = 0xff;
//
// INT2:5 6 7 8 13 14 15 16
// --------------------------------------------------
// 如要选择第 5路port900 = 0xff, port700 = 0xfe, port300 = 0xff, port200 = 0xff;
// 如要选择第13路port900 = 0xff, port700 = 0xef, port300 = 0xff, port200 = 0xff;
//
// Nmi:21 22 23 24 29 30 31 32
// --------------------------------------------------
// 如要选择第21路port900 = 0xfe, port700 = 0xff, port300 = 0xff, port200 = 0xff;
// 如要选择第29路port900 = 0xef, port700 = 0xff, port300 = 0xff, port200 = 0xff;
uiPort900Val = 0xffff; uiPort700Val = 0xffff; uiPort300Val = 0xffff;
port900 = uiPort900Val; port700 = uiPort700Val; port300 = uiPort300Val; // 以下只操作port200即可
// 用于防止串口数不同,错误的中断可能导致程序运行错误
// ---------------------------------------------------
// INT0:第一、三片串口芯片中断使用DSP的INT0, 1、 2、 3、 4、 9、10、11、12;
uiTotalComThisTime = cnMaxComThisType > 8 ? 8:4; // 本类型的最大串口数
for (uiComNo0_1_2 = 0; uiComNo0_1_2 < uiTotalComThisTime; uiComNo0_1_2 ++)
{
uiMaskINT0_1_2 = 1 << uiComNo0_1_2;
// INT0:第一、三片串口芯片中断使用DSP的INT0, 1、 2、 3、 4、 9、10、11、12;
if (uiComNo0_1_2 < 4)
uiComNoINT0_1_2 = uiComNo0_1_2; // 1、 2、 3、 4
else
uiComNoINT0_1_2 = uiComNo0_1_2 + 4; // 9、10、11、12
if (uiComNo0_1_2 >= cnMaxComThisType) break; // 本类型的最大串口数
uiPort200Val = ~uiMaskINT0_1_2;
port200 = uiPort200Val; // TL16c554路选方法
// 由INT0、INT1和INT2调用的串口信息接收函数
vRecvComInforByInt0_1_2(); // 因为INT0、INT1和INT2的中断级别相同,因此可以使用同一函数,而不会造成重入问题
// 若还有数据等待发送,启动串口中断
if (uiComTempSendBytePtr[uiComNoINT0_1_2])
blIntr0NeedToBeActive = TRUE; // 主程序有必要启动一次INTR0;每次收到网络数据,均应置此标志,以便启动串口发送
} // for (uiComNo0_1_2 = 0; uiComNo0_1_2 < 8; uiComNo0_1_2 ++)
uiPort200Val = 0xffff; // 放弃所有串口选择
port200 = uiPort200Val; // TL16c554路选方法
uiInINT0_1_2 = 0x0000; // 未在INT0、INT1或INT2服务中
}
// INT1:第五、七片串口芯片中断使用DSP的INT1,17、18、19、20、25、26、27、28;
interrupt void ivInt1Function()
{
UINT uiTotalComThisTime; // 用于防止串口数不同,错误的中断可能导致程序运行错误
//////////////////
// 中断函数主体 //
//////////////////
blIntr1NeedToBeActive = FALSE; // 主程序有必要启动一次INTR1;每次收到网络数据,均应置此标志,
// INT1:第五、七片串口芯片中断使用DSP的INT1,17、18、19、20、25、26、27、28;
if (cnMaxComThisType < 17) return; // 本类型的最大串口数
uiInINT0_1_2 = 0xff01; // 在INT1服务中
// 串口芯片中断标识位读取地址:
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应INTA1、INTB1、INTC1、INTD1、INTA3、INTB3、INTC3、INTD3;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应INTA2、INTB2、INTC2、INTD2、INTA4、INTB4、INTC4、INTD4;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应INTA5、INTB5、INTC5、INTD5、INTA7、INTB7、INTC7、INTD7;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0-D8分别对应INTA6、INTB6、INTC6、INTD6、INTA8、INTB8、INTC8、INTD8;
//
// 用通道号表示
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应 1、 2、 3、 4、 9、10、11、12;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应 5、 6、 7、 8、13、14、15、16;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应17、18、19、20、25、26、27、28;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0-D8分别对应21、22、23、24、29、30、31、32;
// 具体查询是那路串口有中断发生
// ----------------------------
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应17、18、19、20、25、26、27、28;
port500 = 0x10;
uiInterruptFlagINT0_1_2 = port600; // 读取8位串口中断位标志
// TL16c554路选方法
// ================
// 端口地址 D0 D1 D2 D3 D4 D5 D6 D7
// -------- ---- ---- ---- ---- ---- ---- ---- ----
// INT0: 200H CSA1 CSB1 CSC1 CSD1 CSA3 CSB3 CSC3 CSD3
// INT1: 300H CSA5 CSB5 CSC5 CSD5 CSA7 CSB7 CSC7 CSD7
// INT2: 700H CSA2 CSB2 CSC2 CSD2 CSA4 CSB4 CSC4 CSD4
// Nmi: 900H CSA6 CSB6 CSC6 CSD6 CSA8 CSB8 CSC8 CSD8
//
// 用通道号表示
// INT0: 200H 1 2 3 4 9 10 11 12
// INT1: 300H 17 18 19 20 25 26 27 28
// INT2: 700H 5 6 7 8 13 14 15 16
// Nmi: 900H 21 22 23 24 29 30 31 32
//
// INT0:1 2 3 4 9 10 11 12
// --------------------------------------------------
// 如要选择第 1路port900 = 0xff, port700 = 0xff, port300 = 0xff, port200 = 0xfe;
// 如要选择第 9路port900 = 0xff, port700 = 0xff, port300 = 0xff, port200 = 0xef;
//
// INT1:17 18 19 20 25 26 27 28
// ---------------------------------------------------
// 如要选择第17路port900 = 0xff, port700 = 0xff, port300 = 0xfe, port200 = 0xff;
// 如要选择第25路port900 = 0xff, port700 = 0xff, port300 = 0xef, port200 = 0xff;
//
// INT2:5 6 7 8 13 14 15 16
// --------------------------------------------------
// 如要选择第 5路port900 = 0xff, port700 = 0xfe, port300 = 0xff, port200 = 0xff;
// 如要选择第13路port900 = 0xff, port700 = 0xef, port300 = 0xff, port200 = 0xff;
//
// Nmi:21 22 23 24 29 30 31 32
// --------------------------------------------------
// 如要选择第21路port900 = 0xfe, port700 = 0xff, port300 = 0xff, port200 = 0xff;
// 如要选择第29路port900 = 0xef, port700 = 0xff, port300 = 0xff, port200 = 0xff;
uiPort900Val = 0xffff; uiPort700Val = 0xffff; uiPort200Val = 0xffff;
port900 = uiPort900Val; port700 = uiPort700Val; port200 = uiPort200Val; // 以下只操作port300即可
// 用于防止串口数不同,错误的中断可能导致程序运行错误
// ---------------------------------------------------
// INT1:第五、七片串口芯片中断使用DSP的INT1,17、18、19、20、25、26、27、28;
uiTotalComThisTime = cnMaxComThisType > 24 ? 8:4; // 本类型的最大串口数
for (uiComNo0_1_2 = 0; uiComNo0_1_2 < uiTotalComThisTime; uiComNo0_1_2 ++)
{
uiMaskINT0_1_2 = 1 << uiComNo0_1_2;
// INT1:第五、七片串口芯片中断使用DSP的INT1,17、18、19、20、25、26、27、28;
if (uiComNo0_1_2 < 4)
uiComNoINT0_1_2 = uiComNo0_1_2 + 16; // 17、18、19、20
else
uiComNoINT0_1_2 = uiComNo0_1_2 + 20; // 25、26、27、28
if (uiComNo0_1_2 >= cnMaxComThisType) break; // 本类型的最大串口数
uiPort300Val = ~uiMaskINT0_1_2;
port300 = uiPort300Val; // TL16c554路选方法
// 由INT0、INT1和INT2调用的串口信息接收函数
vRecvComInforByInt0_1_2(); // 因为INT0、INT1和INT2的中断级别相同,因此可以使用同一函数,而不会造成重入问题
// 若还有数据等待发送,启动串口中断
if (uiComTempSendBytePtr[uiComNoINT0_1_2])
blIntr1NeedToBeActive = TRUE; // 主程序有必要启动一次INTR1;每次收到网络数据,均应置此标志,以便启动串口发送
} // for (uiComNo0_1_2 = 0; uiComNo0_1_2 < 8; uiComNo0_1_2 ++)
uiPort300Val = 0xffff; // 放弃所有串口选择
port300 = uiPort300Val; // TL16c554路选方法
uiInINT0_1_2 = 0x0000; // 未在INT0、INT1或INT2服务中
}
// INT2:第二、四片串口芯片中断使用DSP的INT2, 5、 6、 7、 8、13、14, 、15、16;
interrupt void ivInt2Function()
{
UINT uiTotalComThisTime; // 用于防止串口数不同,错误的中断可能导致程序运行错误
//////////////////
// 中断函数主体 //
//////////////////
blIntr2NeedToBeActive = FALSE; // 主程序有必要启动一次INTR2;每次收到网络数据,均应置此标志,
// INT2:第二、四片串口芯片中断使用DSP的INT2, 5、 6、 7、 8、13、14、15、16;
// if (cnMaxComThisType < 5) return; // 本类型的最大串口数 // 装置最少为8路
uiInINT0_1_2 = 0xff02; // 在INT2服务中
// 串口芯片中断标识位读取地址:
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应INTA1、INTB1、INTC1、INTD1、INTA3、INTB3、INTC3、INTD3;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应INTA2、INTB2、INTC2、INTD2、INTA4、INTB4、INTC4、INTD4;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应INTA5、INTB5、INTC5、INTD5、INTA7、INTB7、INTC7、INTD7;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0-D8分别对应INTA6、INTB6、INTC6、INTD6、INTA8、INTB8、INTC8、INTD8;
//
// 用通道号表示
// INT0:写500H,D1D0 = 00,同时读取600H,D0-D8分别对应 1、 2、 3、 4、 9、10、11、12;
// INT2:写500H,D1D0 = 01,同时读取A00H,D0-D8分别对应 5、 6、 7、 8、13、14、15、16;
// INT1:写500H,D1D0 = 10,同时读取600H,D0-D8分别对应17、18、19、20、25、26、27、28;
// Nmi: 写500H,D1D0 = 11,同时读取A00H,D0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -