⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.c

📁 武汉大学参加飞思卡尔智能汽车大赛的小车程序
💻 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 + -