SPI接続DA変換デバイス

  1. SPI接続DA


    1. SPI接続



    2. DA変換

       MCP4922はSPIで接続可能な2チャンネルのDA変換デバイスです。マニュアルはこちらを参照してください。

  2. 接続回路


    1. 回路構成

       MCP4922(以後DAC)は12ビットのDAを2チャンネル内臓しています。16F88(以後PIC)のSPI機能を利用するため、PICのB4とDACの4、B2(SDO)とDACのSDI、を接続します。また、PICのB5とDACのCSを接続します。B5端子は通常の出力端子で、他のピンを接続可能です。
       PICにはPickKit2を接続端子を用意します。

    2. 回路図




  3. プログラム


    1. ソース

      // SPIDAC:MPCP4922マスターテストプログラム    
      //コマンドH (^A/B,buf,ga,^shdn,d11,d10,d9,d8)
      //コマンドL (d7,d6,  ,d0)
      //^A/B: select out 0:A 1:B 
      //buf vrefへのバッファ回路 1:bufferd 0:unbufferd(default)
      //ga:gain 1:d/4096 0:2*d/4096
      //shdwn: 1:output enable 0:output is high impedance
      
      //マスタの回路は、C4,C3をI2C接続
      //ポートB(下位4bit)、A0 をLED表示(動作確認用)
      
      #include <16f88.h>
      
      #fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
      #use delay(clock = 4000000)      
      //#use i2c(MASTER,slow,sda=PIN_B1,scl=PIN_B4)
      #use fast_io(B)
      
      long val;
      int vh,vl;
      int dd;//dummy data
      
      void main(){
      
          val=0;
         
          set_tris_b(0b10001011);
          
          //SPI_H_TO_L では、下位バイトが正しく設定できない
          setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_4|SPI_SS_DISABLED);     
          set_tris_b(0b10001011);
          
          output_high(PIN_B5);
          output_low(PIN_B6);
          
          delay_ms(100); //wait for Client up  
             
          while(1){
      
               output_low(PIN_B5);//cs=L
               
               vh=val>>8;
               
               //
               vh |= 0b0110000;//select A,bufferd,gain=1;out enable           
            spi_write(vh);
             
            //while(!spi_data_is_in());//read dummy
            //dd = spi_read(); 
                
            //output_high(PIN_B5);
            //output_low(PIN_B5);
            
            vl = val & 0xff;
            
            spi_write(vl);
            
            //while(!spi_data_is_in());//read dummy
            //dd = spi_read();
                      
            output_high(PIN_B5);//cs=H
            
            //output_low(PIN_B6);
            //output_high(PIN_B6);
            
            delay_us(10);
            val+=4;
            if(val > 0x7FF) val=0;
            
            if(val==0) output_toggle(PIN_A0);                         
               //delay_ms(200);
      
           }
               
      }

    2. え???

       実はこの回路なかなか正常に動作しませんでした。setup_spi で、SPI_H_TO_L に設定したら、出力が動き始めました。
      setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_4|SPI_SS_DISABLED);
       マニュアルでは、SPI_L_TO_H と読めます。