📄 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 + -