PIC12F1822のMSSPを使ったi2cマスター動作用の関数です。
/* MSSP使用マスターモード専用I2C関数 */ void i2c_start(void){ // msspはSDAとSCL信号をスタート状態 SEN = 1; // SSPCON2:0 initiate I2C START condition while (SEN == 1); // wait until START bit finishes } void i2c_restart( void) { // msspはSDAとSCL信号をRESTART状態に RSEN = 1; // SSP1CON2:1 Repeated Start while (RSEN==1); } void i2c_write( unsigned char DataByte ){ // DATAをSSP1BUFに書き SSP1BUF = DataByte; // スレーブに転送 while (R_nW == 1); // 転送中はR_nWが1 } unsigned char i2c_read( void) { // 受信可にしてDATAを待つ RCEN = 1; // SSP1CON2:3 Receive enable while (RCEN == 1); // RSEN0になったら、 return SSP1BUF; // SSP1BUFのデータを読み持って返る } void i2c_stop( void) { // msspはSDAとSCL信号をstop状態に PEN = 1; // SSP1CON2:2 initiate I2C STOP condition while (PEN); // PENが0になったら、かえる } void i2c_sendack(unsigned char status) { ACKDT = status; // SSPCON2:5 set to ACK:0,NACK:1 ACKEN = 1; // SSPCON2:4 initiate I2C ACK condition while ( ACKEN); // wait until ACK sequence is over } unsigned char i2c_readack(void) { // ACKをチェック if (ACKSTAT == 0) { // ACK(ACKDT:0)かNACK(ACKDR:1) return 0; // ACK detected } else { return 1; } // ACK not detected } unsigned char i2c_writeto(unsigned char address){ i2c_start(); // 指定アドレスに i2c_write(address | 0x0); // WRITEモードでアドレス if(i2c_readack()) return TRUE; // ACK有ればTRUE return FALSE; // 無ければFALSE } unsigned char i2c_readfrom(unsigned char address){ i2c_start(); // 指定アドレスに i2c_write(address | 0x1); // READモードでアドレス書く if(i2c_readack()) return TRUE; // ACK有ればTRUEで return FALSE; // 無ければFALSEでかえる }
その後色々努力あって、2.4Vで動作する回路接続、プログラムできました。次のページです。
http://chitose6thplant.web.fc2.com/
PIC12F1822のMSSP使用i2cマスター実験(1)(2) デジットで買ったSCG002Bをつないでみた
ググッたり、リンクでこのブログへいらした方で過去書き込みを参照になりたい場合、次のホームページにまとめ情報も一部ありますので、覗いてみてください。
http://chitose6thplant.web.fc2.com/