« パルストランス | トップページ | パルストランスを購入しました。 »

2011年4月24日 (日)

CS8416 のソフトモード 

CS8416のソフトモードの方は レジスターの読み書きが出来たのでほとんど出来上がっているのですが色々な問題から保留していました。

とりあえず完成させることにしましたので、レジスタの読み書きの出来るソースだけ公開しておきます。コンパイルにはPICのCCSが必要ですが、それほど難しく無いので他のコンパイラに書き換える事は簡単だと思います。

//------------------------------------------------------------------------
//   
//       CS8416ソフトモード用
//   
//   
// 使用PIC PIC16F886: 8.0MHz
//------------------------------------------------------------------------

#include "16F886.H"
#fuses INTRC_IO,NOWDT,NOPROTECT,PUT,BROWNOUT,MCLR,NOLVP
#use delay(clock=8000000)
#use rs232(BAUD = 9600,XMIT = PIN_C6, RCV = PIN_C7)

// 関数
void eepromdata_read(void);
void data_out(int data);
int  data_read(void);

// 変数
static int eeprom_data[10];
static int com_data;
//static int reg_data;
static int reg_address;

void main(void)
{
int Addres;
int out_data;
int read_data;
setup_oscillator(OSC_8MHZ);
//ポート設定
setup_adc(NO_ANALOGS);
SET_TRIS_A(0x00);
SET_TRIS_B(0x00);
SET_TRIS_C(0x10);
// 出力ポート初期設定
output_high(PIN_C3); //SCK 
output_high(PIN_C5); //SDO
output_high(PIN_a0); // rest
output_high(PIN_a1); // cs
delay_ms(10);
printf("\r\n START !  \r\n");

//レジスタ 初期設定値をEEPROMから読み取る

eepromdata_read();

// CS8416 RESET
output_low(PIN_a0); // rest
delay_ms(2);
output_high(PIN_a0); // rest

// レジスター初期値 セット
printf("0x00-0x09 set\r\n");
for (Addres = 0; Addres < 0x0a; Addres++)
{
  output_low(PIN_a1);    // cs
  data_out(0x20);     //データの書き込み開始コマンド
  data_out(Addres);    //アドレスの指定
  data_out(eeprom_data[Addres]); //データの書き込み 
  output_high(PIN_a1);   // cs
}

// レジスタの読み込みテスト
printf("READ TEST ! \r\n");
while(1)
{
  printf("\r\n");
  output_low(PIN_a1); // cs
  data_out(0x20);
  data_out(0x05);
  output_high(PIN_a1); // cs

  delay_us(1);

  output_low(PIN_a1); // cs
  data_out(0x21);
  read_data = 0;
  read_data = data_read();
  output_high(PIN_a1); // cs

  printf("0x05  = %X\r\n ",read_data);

  output_low(PIN_a1); // cs
  data_out(0x20);
  data_out(0x04);
  output_high(PIN_a1); // cs

  delay_us(1);

  output_low(PIN_a1); // cs
  data_out(0x21);
  read_data = 0;
  read_data = data_read();
  output_high(PIN_a1); // cs

  printf("0x04 = %X\r\n ",read_data);

  output_low(PIN_a1); // cs
  data_out(0x20);
  data_out(0x02);
  output_high(PIN_a1); // cs

  delay_us(1);

  output_low(PIN_a1); // cs
  data_out(0x21);
  read_data = 0;
  read_data = data_read();
  output_high(PIN_a1); // cs

  printf("0x02 = %X\r\n ",read_data);
  delay_ms(2000);
}
}
void data_out(int data)
{
int sd[10];

sd[0] =  (0x01 & data);
sd[0] >>= 0;
sd[1] =  (0x02 & data);
sd[1] >>= 1;
sd[2] =  (0x04 & data);
sd[2] >>= 2;
sd[3] =  (0x08 & data);
sd[3] >>= 3;
sd[4] =  (0x10 & data);
sd[4] >>= 4;
sd[5] =  (0x20 & data);
sd[5] >>= 5;
sd[6] =  (0x40 & data);
sd[6] >>= 6;
sd[7] =  (0x80 & data);
sd[7] >>= 7;

//bit7
output_bit(PIN_C5,sd[7]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit6
output_bit(PIN_C5,sd[6]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit5
output_bit(PIN_C5,sd[5]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit4
output_bit(PIN_C5,sd[4]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit3
output_bit(PIN_C5,sd[3]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit2
output_bit(PIN_C5,sd[2]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit1
output_bit(PIN_C5,sd[1]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk
//bit0
output_bit(PIN_C5,sd[0]); //sdata
output_low(PIN_C3);   //sclk
output_high(PIN_C3);  //sclk

output_high(PIN_C5);  //SDO
}

int data_read(void)
{
int id[10];
int reg_data;

//bit7
output_low(PIN_C3);  //sclk
id[7] = input(PIN_C4);
output_high(PIN_C3); //sclk
//bit6
output_low(PIN_C3);  //sclk
id[6] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit5
output_low(PIN_C3);  //sclk
id[5] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit4
output_low(PIN_C3);  //sclk
id[4] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit3
output_low(PIN_C3);  //sclk
id[3] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit2
output_low(PIN_C3);  //sclk
id[2] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit1
output_low(PIN_C3);  //sclk
id[1] = input(PIN_C4);
output_high(PIN_C3); //sclk

//bit0
output_low(PIN_C3);  //sclk
id[0] = input(PIN_C4);
output_high(PIN_C3); //sclk

reg_data = 0x80*id[7] + 0x40*id[6]+0x20*id[5]+0x10*id[4];
reg_data = reg_data +  0x08*id[3]+0x04*id[2]+0x02*id[1]+0x01*id[0];

return reg_data;
}

// EEROM DATA READ
void eepromdata_read(void)
{
int loop;
int tmp_data;
//EEPROM アドレス 0x0a が 0xffだったら デフォルト値を書き込む 
tmp_data = read_eeprom(0x0a); //
  if (tmp_data == 0xff)   
  {
   write_eeprom(0x00,0b00000000);    
   write_eeprom(0x01,0b00000000);
   write_eeprom(0x02,0b01000000);
   write_eeprom(0x03,0b00000000);
   write_eeprom(0x04,0b10000000);
   write_eeprom(0x05,0b10001000);
   write_eeprom(0x06,0b00000000);
   write_eeprom(0x07,0b00000000);
   write_eeprom(0x08,0b00000000);
   write_eeprom(0x09,0b00000000);
   write_eeprom(0x0a,0b00000000);
  }
   for (loop = 0;loop < 0x0a;loop++)
   {
    eeprom_data[loop] = read_eeprom(loop);
   } 
}

« パルストランス | トップページ | パルストランスを購入しました。 »

オーディオ機器の自作」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/511109/51475864

この記事へのトラックバック一覧です: CS8416 のソフトモード :

« パルストランス | トップページ | パルストランスを購入しました。 »