找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4512|回复: 0
收起左侧

DSP多通道缓冲串口介绍

[复制链接]
ID:211543 发表于 2017-6-15 16:05 | 显示全部楼层 |阅读模式
DSP多通道缓冲串口可以支持多种通信方式,E1,SPI ,I2C等,可以与声卡芯片,AD芯片等通信。

  1. 一、        接收的配置流程
  2. 1.        Global behavior:
  3. 设置管脚和工作模式
  4. Set the receiver pins to operate as McBSP pins
  5. Enable/disable the digital loopback mode   回环模式
  6. Enable/disable the clock stop mode 时钟停止模式
  7. Enable/disable the receive multichannel selection mode 多通道
  8. 2.        Data behavior:
  9. Choose one or two phases for the receive frame 接受帧单段还是双段
  10. Set the receive word length(s)  接收字长
  11. Set the receive frame length  
  12. Enable/disable the receive frame-sync ignore function
  13. Set the receive companding mode
  14. Set the receive data delay
  15. Set the receive sign-extension and justification mode 数据符号扩展和校验
  16. Set the receive interrupt mode
  17. 3.  Frame-sync behavior:
  18.   Set the receive frame-sync mode
  19.   Set the receive frame-sync polarity
  20.   Set the SRG frame-sync period and pulse width
  21. 4. Clock behavior:
  22. Set the receive clock mode
  23. Set the receive clock polarity
  24. Set the SRG clock divide-down value
  25. Set the SRG clock synchronization mode
  26. Set the SRG clock mode [choose an input clock]
  27. Set the SRG input clock polarity
  28. 二、寄存器配置
  29.         接收时需要配置的寄存器: SPCR1, SPCR2, PCR, RCR1, RCR2SRGR1, SRGR2 ,其他的可以设为default
  30.         下面是一个我的调试配置参数,所有时钟和帧同步都由外部提供
  31. /* create a MCBSP config structure for recevie only mode, ignore the send configrue */
  32. /* 外部提供所有时钟
  33. * 单帧
  34. * 每帧8bit
  35. * CLK 2.048Mhz
  36. * FS 8K
  37. * 数据 1Bit延迟
  38. */
  39. // this configuration OK
  40. static MCBSP_Config MCBSP_READONLY_Config_test= {
  41.      MCBSP_SPCR1_RMK(
  42.      MCBSP_SPCR1_DLB_OFF,    //DLB = 0        Digital loopbakc mode diable
  43.      MCBSP_SPCR1_RJUST_RZF,  // RJUST = 0   Right justify the data and zero fill MSBs         
  44.       MCBSP_SPCR1_CLKSTP_DISABLE, //CLKSTP = 0   Clock stop mode disable         
  45.       MCBSP_SPCR1_DXENA_OFF,      //DXENA = 0 DX delay enabler off
  46.       MCBSP_SPCR1_ABIS_DISABLE,    //reserbed  always write 0      
  47.       MCBSP_SPCR1_RINTM_RRDY,     //RINTM = 00   when the RRDY bit change form 0 to 1,Int mode
  48.       MCBSP_SPCR1_RSYNCERR_NO,    // RSYNCERR = 0   receibe frame-sync error bit, no error                              
  49.       MCBSP_SPCR1_RRST_DISABLE    //RRST = 0 reset the receiver
  50.      //注意:: 开始一定要设置为 disable 否则不能设置它的寄存器,全部为默认值
  51.       //导致不能正常接收, 在 程序调用C库函数 mcbspstart 时会在设为1 McBSP 便退出reset状态开始工作
  52. ),
  53. MCBSP_SPCR2_RMK(
  54. MCBSP_SPCR2_FREE_NO,    //FREE   = 0   
  55. MCBSP_SPCR2_SOFT_NO,    //SOFT   = 0
  56. MCBSP_SPCR2_FRST_RESET,    //FRST   = 0   SPG reset
  57. MCBSP_SPCR2_GRST_RESET,    // GRST   = 0   SPG reset
  58. MCBSP_SPCR2_XINTM_XRDY,    //XINTM  = 0   transmit interrupt mode, XRDY bit change form 0 to 1
  59. MCBSP_SPCR2_XSYNCERR_NO, //XSYNCER = 0  transmit  frame-sync error bit, no error  
  60. MCBSP_SPCR2_XRST_DISABLE    // XRST   = 0, reset the transmitter
  61. //注意:: 开始一定要设置为 disable 否则不能设置它的寄存器, 全部为默认值
  62. //导致不能正常发送, 在 程序调用C库函数 mcbspstart 时会在设为1 McBSP 便退出reset状态开始工作
  63.     ),
  64. MCBSP_RCR2_RMK(
  65. MCBSP_RCR2_RPHASE_SINGLE,    //RPHASE  = 0  single-phase frame
  66. MCBSP_RCR2_RFRLEN2_OF(0),    //RFRLEN2 = 0
  67. MCBSP_RCR2_RWDLEN2_8BIT,    //RWDLEN2 = 0
  68. MCBSP_RCR2_RCOMPAND_MSB,    //RCOMPAND = 0  receibe companding mode, 0:no companding, MSB received first
  69. MCBSP_RCR2_RFIG_NO,    //RFIG    = 1  frame-sync ignore bit ,1: ignore
  70. MCBSP_RCR2_RDATDLY_1BIT    //RDATDLY = 01  receive 1-bit data delay
  71.     ),
  72. MCBSP_XCR1_DEFAULT,    //
  73. MCBSP_XCR2_DEFAULT,    //
  74. MCBSP_SRGR1_RMK(
  75. MCBSP_SRGR1_FWID_OF(0),    //FWID    = 0
  76. MCBSP_SRGR1_CLKGDV_OF(0)    //CLKGDV  = 0
  77.   ),
  78. MCBSP_SRGR2_RMK(
  79. MCBSP_SRGR2_GSYNC_FREE,     // GSYNC    = 0  5502 always write 0
  80. MCBSP_SRGR2_CLKSP_RISING,    //CLKSP   = 0  5502 don't have the CLKS pin  set 0 always rsing edge igern the CLKRP and CLKXP
  81. MCBSP_SRGR2_CLKSM_CLKS,    //CLKSM   = 0  work with the CLKME bit inPCR
  82.      /*  SCLKME              CLKSM         Sample Rate Generator     
  83.            0                   0           Signal on CLKS pin 注意5501没有CLKS pin
  84.            1                   0           Signal on CLKR pin
  85.            0                   1           McBSP internal input clock
  86.                                           (low外设的时钟--SYSCLK3)
  87.            1                   1           Signal on CLKX pin
  88.      /*
  89.       MCBSP_SRGR2_FPER_OF(0)    // FPER    = 0
  90.     ),
  91.     MCBSP_MCR1_DEFAULT,
  92.     MCBSP_MCR2_DEFAULT,
  93.     MCBSP_PCR_RMK(
  94.       MCBSP_PCR_XIOEN_SP,    //XIOEN    = 0
  95.       MCBSP_PCR_RIOEN_SP,   //RIOEN    = 0  
  96.       MCBSP_PCR_FSXM_EXTERNAL,    //FSXM = 0  
  97.       MCBSP_PCR_FSRM_EXTERNAL,    //FSRM     = 0
  98.       MCBSP_PCR_CLKXM_INPUT,    //CLKXM    = 0  
  99.       MCBSP_PCR_CLKRM_INPUT,    //CLKRM    = 0
  100.       MCBSP_PCR_SCLKME_BCLK,    //SCLKME   = 1
  101.       MCBSP_PCR_DXSTAT_0,    //DXSTAT =  0 , used noly the RIOEN bit = 1
  102.       MCBSP_PCR_FSXP_ACTIVEHIGH,    //FSXP     = 0   
  103.       MCBSP_PCR_FSRP_ACTIVEHIGH,    // FSRP     = 0   
  104.       MCBSP_PCR_CLKXP_RISING,      //CLKXP    = 0  
  105.       MCBSP_PCR_CLKRP_FALLING    //CLKRP    = 0   
  106.     ),
  107.     MCBSP_RCERA_DEFAULT,
  108.     MCBSP_RCERB_DEFAULT,
  109.     MCBSP_RCERC_DEFAULT,
  110.     MCBSP_RCERD_DEFAULT,
  111.     MCBSP_RCERE_DEFAULT,
  112.     MCBSP_RCERF_DEFAULT,
  113.     MCBSP_RCERG_DEFAULT,
  114.     MCBSP_RCERH_DEFAULT,
  115.     MCBSP_XCERA_DEFAULT,
  116.     MCBSP_XCERB_DEFAULT,
  117.     MCBSP_XCERC_DEFAULT,
  118.     MCBSP_XCERD_DEFAULT,
  119.     MCBSP_XCERE_DEFAULT,
  120.     MCBSP_XCERF_DEFAULT,
  121.     MCBSP_XCERG_DEFAULT,
  122.     MCBSP_XCERH_DEFAULT
  123.      };
  124. 注意的几点:
  125. 1.  在configure是 RRST 和 XRST 一定要设置为Disable,才可以正确的配置他的各个寄存器
  126. 2. 5502 不支持 CLKG的同步  SRGR2中的 GSYNC bit 始终写为 0
  127. 使用时如下步骤:

  128. IRQ_globalDisable();
  129. hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
  130. rcvEventID = MCBSP_getRcvEventId(hMcbsp);
  131. IRQ_setVecs((Uint32)(&VECSTART));
  132. IRQ_clear(rcvEventID);
  133. IRQ_plug(rcvEventID, &readISR);
  134. MCBSP_config(hMcbsp, &MCBSP_READONLY_Config_ _test);
  135. IRQ_enable(rcvEventID);
  136. /* Start Sample Rate Generator and Frame Sync */
  137. MCBSP_start(hMcbsp,MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,0x300);  //如果需要
  138. /* Enable MCBSP transmit and receive */
  139. MCBSP_start(hMcbsp,  MCBSP_RCV_START ,  0);
  140. IRQ_globalEnable();
  141. 三、测试例程
  142. 下面是我的一个测试程序,可以正确接受数据:
  143. /*
  144. * Copyright (C) 2010 2202Lab tiany
  145. * All Rights Reserved
  146. */
  147. /*
  148. *---------mcbsp_test.c---------
  149. * McBSP receive and send example
  150. */
  151. #include <stdio.h>
  152. #include <csl.h>
  153. #include <csl_mcbsp.h>
  154. #include <csl_irq.h>
  155. //---------Global constants---------
  156. #define SIZE                        1024
  157. //---------Global data definition---------
  158. //Handle for McBSP
  159. static volatile MCBSP_Handle hMcbsp;
  160. //Buffers to store data
  161. static volatile Uint16 writeBuff[SIZE], readBuff[SIZE];
  162. Uint16 rcvEventID;
  163. Uint16 cnt=0;
  164. /* create a MCBSP config structure for recevie only mode, ignore the send configrue */
  165. /* 外部提供所有时钟
  166. * 单帧
  167. * 每帧8bit
  168. * CLK 2.048Mhz
  169. * FS 8K
  170. * 数据 1Bit延迟
  171. */
  172. // this configuration OK
  173. static MCBSP_Config MCBSP_READONLY_Config_test= {
  174.         MCBSP_SPCR1_RMK(
  175.         MCBSP_SPCR1_DLB_OFF,    //DLB = 0         Digital loopbakc mode diable
  176.         MCBSP_SPCR1_RJUST_RZF,  // RJUST = 0  Right justify the data and zero fill MSBs         
  177.         MCBSP_SPCR1_CLKSTP_DISABLE,    //CLKSTP = 0   Clock stop mode disable         
  178.         MCBSP_SPCR1_DXENA_OFF,    //DXENA = 0 DX delay enabler off
  179. MCBSP_SPCR1_ABIS_DISABLE,   //reserbed  always write 0      
  180.         MCBSP_SPCR1_RINTM_RRDY,     //RINTM = 00  when the RRDY bit change form 0 to 1,Int mode
  181.         MCBSP_SPCR1_RSYNCERR_NO,    // RSYNCERR = 0   receibe frame-sync error bit, no error                              
  182. MCBSP_SPCR1_RRST_DISABLE    //RRST = 0 reset the receiver
  183.         //注意 开始一定要设置为 disable 否则不能设置它的寄存器,导致不能正常工作, 在 mcbspstart时会在设为1 McBSP 便开始工作
  184.                   ),
  185.    MCBSP_SPCR2_RMK(
  186. MCBSP_SPCR2_FREE_NO,    //FREE   = 0   
  187. MCBSP_SPCR2_SOFT_NO,    //SOFT   = 0
  188. MCBSP_SPCR2_FRST_RESET,    //FRST   = 0   SPG reset
  189. MCBSP_SPCR2_GRST_RESET,    // GRST   = 0   SPG reset
  190. MCBSP_SPCR2_XINTM_XRDY,    //XINTM  = 0   transmit interrupt mode, XRDY bit change form 0 to 1
  191. MCBSP_SPCR2_XSYNCERR_NO,    //XSYNCER = 0  transmit  frame-sync error bit, no error  
  192. MCBSP_SPCR2_XRST_DISABLE    // XRST   = 0, reset the transmitter
  193.                   ),
  194.    MCBSP_RCR1_RMK(
  195. MCBSP_RCR1_RFRLEN1_OF(0),    // RFRLEN1 = 0   receive fram length 1
  196. MCBSP_RCR1_RWDLEN1_8BIT    // RWDLEN1 = 0  8bit   receive word length 1
  197.                   ),
  198.    MCBSP_RCR2_RMK(
  199. MCBSP_RCR2_RPHASE_SINGLE,    //RPHASE  = 0  single-phase frame
  200. MCBSP_RCR2_RFRLEN2_OF(0),    //RFRLEN2 = 0
  201. MCBSP_RCR2_RWDLEN2_8BIT,    //RWDLEN2 = 0
  202. MCBSP_RCR2_RCOMPAND_MSB,    //RCOMPAND = 0  receibe companding mode, 0:no companding, MSB received first
  203.         MCBSP_RCR2_RFIG_NO,    //RFIG    = 1  frame-sync ignore bit ,1: ignore
  204.         MCBSP_RCR2_RDATDLY_1BIT    //RDATDLY = 01  receive 1-bit data delay
  205.                   ),
  206.     MCBSP_XCR1_DEFAULT,    //
  207.         MCBSP_XCR2_DEFAULT,    //
  208.         MCBSP_SRGR1_RMK(
  209.         MCBSP_SRGR1_FWID_OF(0),    //FWID    = 0
  210.         MCBSP_SRGR1_CLKGDV_OF(0)    //CLKGDV  = 0
  211.                   ),
  212.                   MCBSP_SRGR2_RMK(
  213.                     MCBSP_SRGR2_GSYNC_FREE,     // GSYNC    = 0  5502 always write 0
  214.                     MCBSP_SRGR2_CLKSP_RISING,    //CLKSP   = 0  5502 don't have the CLKS pin  set 0 always rsing edge igern the CLKRP and CLKXP
  215.                     MCBSP_SRGR2_CLKSM_CLKS,    //CLKSM   = 0  work with the CLKME bit inPCR
  216.      MCBSP_SRGR2_FSGM_DXR2XSR,     //FSGM    = 0
  217.          MCBSP_SRGR2_FPER_OF(0)    // FPER    = 0
  218.                   ),
  219.                   MCBSP_MCR1_DEFAULT,
  220.                   MCBSP_MCR2_DEFAULT,
  221.                   MCBSP_PCR_RMK(
  222.                     MCBSP_PCR_XIOEN_SP,    //XIOEN    = 0
  223.                     MCBSP_PCR_RIOEN_SP,   //RIOEN    = 0  
  224.                     MCBSP_PCR_FSXM_EXTERNAL,    //FSXM = 0  
  225.                     MCBSP_PCR_FSRM_EXTERNAL,    //FSRM     = 0
  226.                     MCBSP_PCR_CLKXM_INPUT,    //CLKXM    = 0  
  227.                     MCBSP_PCR_CLKRM_INPUT,    //CLKRM    = 0
  228.                     MCBSP_PCR_SCLKME_BCLK,    //SCLKME   = 1
  229.                     MCBSP_PCR_DXSTAT_0,    //DXSTAT =  0 , used noly the RIOEN bit = 1
  230.                     MCBSP_PCR_FSXP_ACTIVEHIGH,    //FSXP     = 0   
  231.                     MCBSP_PCR_FSRP_ACTIVEHIGH,    // FSRP     = 0   
  232.                     MCBSP_PCR_CLKXP_RISING,      //CLKXP    = 0  
  233.                     MCBSP_PCR_CLKRP_FALLING    //CLKRP    = 0   
  234.                   ),
  235.                   MCBSP_RCERA_DEFAULT,
  236.                   MCBSP_RCERB_DEFAULT,
  237.                   MCBSP_RCERC_DEFAULT,
  238.                   MCBSP_RCERD_DEFAULT,
  239.                   MCBSP_RCERE_DEFAULT,
  240.                   MCBSP_RCERF_DEFAULT,
  241.                   MCBSP_RCERG_DEFAULT,
  242.                   MCBSP_RCERH_DEFAULT,
  243.                   MCBSP_XCERA_DEFAULT,
  244.                   MCBSP_XCERB_DEFAULT,
  245.                   MCBSP_XCERC_DEFAULT,
  246.                   MCBSP_XCERD_DEFAULT,
  247.                   MCBSP_XCERE_DEFAULT,
  248.                   MCBSP_XCERF_DEFAULT,
  249.                   MCBSP_XCERG_DEFAULT,
  250.                   MCBSP_XCERH_DEFAULT
  251.             };
  252. interrupt void readISR(void);
  253. extern void VECSTART(void);//外部中断向量表  
  254. //使用的TI例程 没有改动 在/CCStudio_v3.3/examples/c5502/csl/mcbsp/mcbsp2目录下的vectors_mcbsp2.s55
  255. //---------main routine---------
  256. void main()
  257. {
  258.     Uint16  i;
  259.     for (i = 0; i <= SIZE - 1; i++) {
  260.             readBuff[i] = 0x00;
  261.     }
  262.     CSL_init();
  263.     //Disable interrupt
  264.     IRQ_globalDisable();
  265.     //Open McBSP channel
  266.     hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
  267.     /* Get EventId's associated with MCBSP Port 1 receive and transmit */
  268. rcvEventID = MCBSP_getRcvEventId(hMcbsp);

  269.     IRQ_setVecs((Uint32)(&VECSTART));
  270.     /* Clear any pending receive or transmit interrupts */
  271.     IRQ_clear(rcvEventID);
  272.     IRQ_plug(rcvEventID, &readISR);

  273.     /* Write values from configuration structure to MCBSP control regs */
  274.     MCBSP_config(hMcbsp, &MCBSP_READONLY_Config_test);

  275.     /* Enable the MCBSP receive and transmit interrupts */
  276.     IRQ_enable(rcvEventID);

  277.         /* Enable MCBSP transmit and receive */
  278.         MCBSP_start(hMcbsp,
  279.           MCBSP_RCV_START ,
  280.           0);

  281.         IRQ_globalEnable();
  282.         while(1);
  283. }
  284. // ISR to receive data
  285. interrupt void readISR(void)
  286. {
  287.     readBuff[cnt] = MCBSP_read16(hMcbsp);
  288.     cnt++;
  289.     if (cnt == SIZE)
  290.     {
  291.         cnt = 0;
  292.     }
  293. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表