⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tms320vc5416与tlc16c554的接口函数.c

📁 TMS320VC5416与TL16CC554的接口函数,扩展4个高速串口。
💻 C
📖 第 1 页 / 共 3 页
字号:
   }
  } // 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 + -