[经验] DSP28335外接DAC8554教程

1175722741   2016-5-30 15:55 楼主

DAC8554芯片的数据传输接口为SPI,每一帧为24位;但是28335的SPI接口最高可配置为16位。

使用28335控制DAC8554方法有三种:

1.才用IO口模拟SPI接口通信;

2.灵活使用28335的SPI接口通信;

3.使用28335的McBSP接口按照DAC8554的时序自定义通信格式。

此处以第二种方法为例:

dsp28335与DAC8554的接线为:



DAC8554的写时序为:


/SYNC必须在D_IN发送24位后DAC才认为接收到的数据为有效数据,否则,将接收到的数据舍弃。

本实验所使用的具体方法是开启28335SPI的FIFO功能,将24位数据帧分成两个12位的数据,依次存入SPITXBUF,这样就可以spi成功发送24的帧

  1. #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File  
  2. #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File  
  3.   
  4. #define   spi_socket    0x10//OUTA  
  5.   
  6.   
  7.   
  8.   
  9. void spi_fifo_init(void);  
  10. void spi_init(void);  
  11. void spi_xmit(Uint16 a);  
  12.   
  13.   
  14. void main(void)  
  15. {  
  16.    float sdata;  // send data  
  17.      
  18. // Step 1. Initialize System Control:  
  19. // PLL, WatchDog, enable Peripheral Clocks  
  20. // This example function is found in the DSP2833x_SysCtrl.c file.  
  21.    InitSysCtrl();  
  22.   
  23. // Step 2. Initalize GPIO:   
  24. // This example function is found in the DSP2833x_Gpio.c file and  
  25. // illustrates how to set the GPIO to it's default state.  
  26. // InitGpio();  // Skipped for this example   
  27. // Setup only the GP I/O only for SPI-A functionality  
  28. // This function is found in DSP2833x_Spi.c  
  29.   
  30.    InitXintf16Gpio();   //zq  
  31.   
  32.    InitSpiaGpio();  
  33.   
  34. // Step 3. Clear all interrupts and initialize PIE vector table:  
  35. // Disable CPU interrupts   
  36.    DINT;  
  37.   
  38. // Initialize PIE control registers to their default state.  
  39. // The default state is all PIE interrupts disabled and flags  
  40. // are cleared.   
  41. // This function is found in the DSP2833x_PieCtrl.c file.  
  42.    InitPieCtrl();  
  43.   
  44. // Disable CPU interrupts and clear all CPU interrupt flags:  
  45.    IER = 0x0000;  
  46.    IFR = 0x0000;  
  47.      
  48. // Initialize the PIE vector table with pointers to the shell Interrupt   
  49. // Service Routines (ISR).   
  50. // This will populate the entire table, even if the interrupt  
  51. // is not used in this example.  This is useful for debug purposes.  
  52. // The shell ISR routines are found in DSP2833x_DefaultIsr.c.  
  53. // This function is found in DSP2833x_PieVect.c.  
  54.    InitPieVectTable();  
  55.       
  56. // Step 4. Initialize all the Device Peripherals:  
  57. // This function is found in DSP2833x_InitPeripherals.c  
  58. // InitPeripherals(); // Not required for this example  
  59.    spi_fifo_init();   // Initialize the Spi FIFO  
  60.    spi_init();        // init SPI  
  61.   
  62. // Step 5. User specific code:  
  63.   
  64.   
  65.   
  66.      // Transmit data  
  67.      sdata=sdata*198.6;//  变比为100/1  
  68.      spi_xmit(sdata);  
  69.   
  70. }     
  71.   
  72.   
  73. // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:     
  74.   
  75.   
  76. void spi_init()  
  77. {      
  78.     SpiaRegs.SPICCR.all =0x000B;                 // Reset on, rising edge, 12-bit char bits  
  79.     SpiaRegs.SPICTL.all =0x0006;                 // Enable master mode, normal phase,  
  80.                                                  // enable talk, and SPI int disabled.  
  81.     SpiaRegs.SPIBRR =0x0004;//150M/2/(SPIBRR+1)=15M  
  82.     SpiaRegs.SPICCR.all =0x009B;                 // Relinquish SPI from Reset  
  83.     SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission  
  84. }  
  85.   
  86. void spi_xmit(Uint16 a)  
  87. {  
  88.     SpiaRegs.SPITXBUF=(((spi_socket<<8)&0xff00)|((a>>8)&0x00ff));  
  89.     SpiaRegs.SPITXBUF=(a<<4);  
  90. }      
  91.   
  92. void spi_fifo_init()                                          
  93. {  
  94. // Initialize SPI FIFO registers  
  95.     SpiaRegs.SPIFFTX.all=0xE040;  
  96.     SpiaRegs.SPIFFRX.all=0x204f;  
  97.     SpiaRegs.SPIFFCT.all=0x0;  
  98. }   
  99.   
  100.   
  101. //===========================================================================  
  102. // No more.  
  103. //===========================================================================

另外还需配置IO口:

  1. GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;   // Enable pull-up on GPIO54 (SPISIMOA)  
  2.     GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;   // Enable pull-up on GPIO55 (SPISOMIA)  
  3.     GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;   // Enable pull-up on GPIO56 (SPICLKA)  
  4.     GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;   // Enable pull-up on GPIO57 (SPISTEA)  
  5. GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO54 (SPISIMOA)  
  6.     GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO55 (SPISOMIA)  
  7.     GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO56 (SPICLKA)  
  8.     GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO57 (SPISTEA)  
  9. GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOA  
  10.     GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIA  
  11.     GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA  
  12.     GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA

想更改传输速率的自己修改SPI的时序


回复评论 (3)

不错,学习了
点赞  2018-1-31 15:24
看看学习下
点赞  2018-11-22 11:41
SpiaRegs.SPITXBUF=(((spi_socket<<8)&0xff00)|((a>>8)&0x00ff));  
这个有什么意义呢?求解
点赞  2019-4-1 22:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复