?? iic.c
字號:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define S12_IIC_ID 0x00
#define S12_IIC_CLK 0x22 //Bus=24MHz,iic_clock分頻224=109k
#define SLAVE_WRITE_ID 0x42
#define SLAVE_READ_ID 0x43
//-------------------------------------------------
//函數名init_IIC()
//功能:初始化S12的I2C總線模塊
//用法:init_IIC();
//-------------------------------------------------
void init_IIC(void){
IBFD = S12_IIC_CLK;
IBAD = S12_IIC_ID; //set s12's iic address
IBCR_IBEN = 1; //enable IIC
IBSR_IBAL = 1; //clear the IBAL
}
//-------------------------------------------------
//函數名iic_write()
//功能:通過I2C總線對OV7620內部寄存器進行賦值
//用法:iic_write(0x28,0xA0);
//-------------------------------------------------
/*
OmniVision CMOS SCCB總線專用寄存器寫入函數(兼容I2C)
用法: iic_write(寄存器地址,寄存器值);
eg: iic_write(0x02,0x80); //對02號寄存器寫入0x80
*/
void iic_write(byte sub_address,byte write_record){
while(IBSR_IBB==1); //wait for bus free
IBCR_MS_SL = 1; //master mode
IBCR_TX_RX = 1; //write first send the slave id
IBDR = SLAVE_WRITE_ID; // send the slave write address
while(!IBSR_IBIF); // wait until address send complete
IBSR_IBIF = 1; // clear the IBIF
while(IBSR_RXAK); // wait for acknowledge
IBDR = sub_address; //send subaddress of the reg.
while(!IBSR_IBIF); //wait for subaddress send complete
IBSR_IBIF = 1; //clear the IBIF
while(IBSR_RXAK); // wait for acknowledge
IBDR = write_record; //send the value of reg.
while (!IBSR_IBIF); // wait until IBIF
IBSR_IBIF=1; // clear the interrupt event flag
while(IBSR_RXAK); // check for RXAK
IBCR_MS_SL = 0; // generate STOP signal
}
//-------------------------------------------------
//函數名iic_read()
//功能:通過I2C總線讀取OV7620內部寄存器值
//用法:iic_read(0x1C);
//-------------------------------------------------
/*
讀取OV寄存器專用函數iic_read()
OV的CMOS傳感器SCCB總線讀取內部寄存器方法為:
控制器先發起一個2相假寫命令,即送出slaveID和subaddress;
使OV7620內部寄存器讀寫指針指向要讀取的地址。(參考OV7620_datasheet
和sccb手冊。)
然后開始新的數據讀取周期,由master發起,送出slave的read地址,
等待地址發送完成后收到一個ack,立刻轉入接收模式,slave送來當前地址的
寄存器值,
*/
/*
byte iic_read(byte sub_address){
byte read_record;
int i=0;
//start dummy write cycle 開始一個2相假寫入命令,指定要讀取的寄存器
while(IBSR_IBB==1); //wait for bus free
IBCR_MS_SL = 1; //master mode
IBCR_TX_RX = 1; //write first send the slave id
IBDR = SLAVE_WRITE_ID; // send the slave write address
while(!IBSR_IBIF); // wait until address send complete
IBSR_IBIF = 1; // clear the IBIF
while(IBSR_RXAK); // wait for acknowledge
IBDR = sub_address; //send subaddress of the reg.
while(!IBSR_IBIF); //wait for subaddress send complete
IBSR_IBIF = 1; //clear the IBIF
while(IBSR_RXAK); // wait for acknowledge
//dummy write cycle ends
//IBCR_RSTA = 1; //repeat a start OV7620不支持,先stop再start
IBCR_MS_SL = 0;
IBCR_MS_SL = 1;
IBDR = SLAVE_READ_ID; //send slave read address
while(!IBSR_IBIF); //wait until address send complete
IBSR_IBIF = 1; //clear IBIF
while(IBSR_RXAK); //wait for acknowledge
IBCR_TX_RX = 0; //start to receive
while(!IBSR_IBIF); //wait for IBIF ?????
read_record = IBDR; //read value
IBSR_IBIF = 1; //clear IBIF
IBCR_TXAK = 1; // acknowledge disable
IBCR_MS_SL= 0; //stop
//read_record = IBDR; //read value
return read_record;
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -