/*======================================================================== * File: i2C_function.c * Author: VividHobby * *======================================================================== */ #include //--------------------------------------------------------------------- // i2C 処理関数 //--------------------------------------------------------------------- //=== 変数定義 === unsigned char read_data, write_data; // i2C 入出力データ unsigned char slv_adrs; // slave address = 0bXXXX XXX- //---------------------------------- // i2C 初期化 //---------------------------------- void i2c_init_setup(void) { SSPM3 = 1; SSPM2 = 0; SSPM1 = 0; SSPM0 = 0; SMP = 1; CKE = 0; SSPADD = 0x3F; SSPEN = 1; WCOL = 0; SSPOV = 0; } //---------------------------------- // i2C START Condition //---------------------------------- void i2C_start(void) { SEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; } //---------------------------------- // i2C Re-START Condition //---------------------------------- void i2C_restart(void) { RSEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; } //----------------------------------- // i2C STOP Condition //----------------------------------- void i2c_stop(void) { PEN = 1; while (SSPIF == 0); SSPIF = 0; } //------------------------------------ // i2C READ one : read_data //------------------------------------ unsigned char i2C_read_one() { ACKDT = 1; RCEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す read_data = SSPBUF; SSPIF = 0; ACKEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; return read_data; } //------------------------------------ // i2C READ Continue : read_data //------------------------------------ unsigned char i2C_read_multi() { ACKDT = 0; RCEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す read_data = SSPBUF; SSPIF = 0; ACKEN = 1; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; return read_data; } //------------------------------------- // i2C Send slave address for read //------------------------------------- void i2c_send_sa_read(slv_adrs) { while (BF == 1); //BFが0になるまで待つ。1の間繰り返す。 SSPBUF = slv_adrs + 1; SSPIF = 0; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; } //------------------------------------- // i2C Send slave address for write //------------------------------------- void i2c_send_sa_write(slv_adrs) { while (BF == 1); //BFが0になるまで待つ。1の間繰り返す。 SSPBUF = slv_adrs; SSPIF = 0; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; } //------------------------------------- // i2C WRITE (write_data) //------------------------------------- void i2C_write(unsigned char parameter) { while (BF == 1); //BFが0になるまで待つ。1の間繰り返す。 SSPBUF = write_data; SSPIF = 0; while (SSPIF == 0); //SSPIFが1になるまで待つ。0の間繰り返す SSPIF = 0; } //------------------------------------------ // メインプログラムを記述 //------------------------------------------ void main(void) { return; }