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

📄 main.c

📁 利用IIC总线从而与三基色图像传感器进行通信
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

unsigned char receive_data=0;

/*void interrupt IIC_receive()
{
  IICS_IICIF=1;
  receive_data=IICD;
} */

/*void Init_ICS()
{                           
  ICSTRM=NV_ICSTRM;
  ICSC1=0X04;
  ICSC2=0X40;
  ICSSC=0X00;
} */

/***************发送数据*****************************/
void IIC_send_data(unsigned char send_data)
{
  IICD=send_data;
}
/*****************************************************/

/***************IIC接收使能*****************************/
void IIC_receive_enable()
{
  IICC_TX=0;     //接收模式
  IICC_TXAK=1;   //没有送出应答信号
}
/*******************************************************/

/***************写从寄存器数据***************************/
void IIC_REG_Write(uchar Write_address,uchar Write_value)  //S313写地址为B0H(包括一个读写位)
{
 IICC_TX=1;
 IICD=0B0H;            //主发送从地址+读写位W
 while(IICS_BUSY)
 {
  while(!IICS_IICIF);
  IICS_IICIF=1;
  while(IICS_RXAK);
  IIC_send_data(Write_address);  //发送写到从寄存器地址
  while(!IICS_IICIF);
  IICS_IICIF=1;
  while(IICS_RXAK);
  IIC_send_data(Write_value);    //发送写到从寄存器上的数据
  while(!IICS_IICIF);
  IICS_IICIF=1;
  while(IICS_RXAK);
  IICC_MST=0;
 }
}
/********************************************************/

/***************读从寄存器数据*****************************/
void IIC_REG_Read(uchar Read_address)           //S313读地址为B1H (包括一个读写位)
{
 IICC_TX=1;                 //发送模式
 IICD=0B0H;                 //主发送从地址+读写位W
 while(IICS_BUSY)           //总线忙,STOP信号时清除
 {
  while(!IICS_IICIF);
  IICS_IICIF=1;
  while(IICS_RXAK);
  IIC_send_data(Read_address);  
  while(!IICS_IICIF);
  IICS_IICIF=1;
  while(IICS_RXAK);
  
  IICC_RSTA=1;              //产生REPEATED START信号
  IIC_receive_enable();     //IIC接收使能
  IICD=0B1H;                //主发送从地址+读写位R
  while(!IICS_IICIF);       //等待字节传输结束
  IICS_IICIF=1;             //清IIC中断标志
  while(IICS_RXAK);         //检查RXAK接收应答位
  
  receive_data=IICD;        //空读IICD
  while(!IICS_IICIF);
  IICS_IICIF=1;
  IICC_MST=0;               //产生STOP信号
  receive_data=IICD;        //读从寄存器数据
  
  return receive_data;      //返回从寄存器数据值
 }
}
/********************************************************/

/****************IIC初始化*******************************/
void IIC_Init()
{
  IICC_IICEN=1;   //iic使能
  IICC_IICIE=1;   //iic中断请求使能
  IICC_MST=1;   //主模式
  IICF=0x4b;   //MULT 01---> mul=02,ICR=0x0b(001011),SDA=1.125us,baud rate=bus clock/(mul*SCL分频数)=100kbps
  
}
/********************************************************/

/*******************延时子程序***************************/
void WAIT()
{
  uint i;
  for(i=0;i<1000;i++);
}
/********************************************************/

/****************获取传感器值****************************/
void SENSOR_VALUE_ACQUIRE() {
  //获取ADC值
  IIC_REG_Write(ACQ,0X02H);     //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
  while(IIC_REG_Read(ACQ));     //ACQ为0时读ADCR,ADCG,ADCB
  data_temp1=IIC_REG_Read(ADCR_);  //读ADCR,ADCG,ADCB寄存器值
  data_temp2=IIC_REG_Read(ADCG);   //地址分别为44H,43H,42H
  data_temp3=IIC_REG_Read(ADCB);
  
  //计算相对值
  SENSR=data_temp1-OFFSET_R;
  SENSG=data_temp1-OFFSET_G;
  SENSB=data_temp1-OFFSET_B; */
}
/********************************************************/

/***************传感器增益优化***************************/
void SENSOR_GAIN_OPTIMIZATION()
{
  XRST=0;   //S313硬件复位
  WAIT();   //等待复位完成
  IIC_REG_Write(SETUP0,0X01H);  //设置开始寄存器SETUP0-4
  IIC_REG_Write(SETUP1,0X01H);  //寄存器地址分别为03H,04H,0CH,0DH,0EH
  IIC_REG_Write(SETUP2,0X01H);
  IIC_REG_Write(SETUP3,0X01H);
  IIC_REG_Write(SETUP4,0X01H);
  
 /*******以下部分复位后有默认值,故可不设置**********/ 
/*IIC_REG_Write(PDASR,0X07H);   //写增益寄存器选择光电二极管大小,这里选择3/4 SIZE
  IIC_REG_Write(PDASG,0X07H);   //寄存器地址分别为0BH,0AH,09
  IIC_REG_Write(PDASB,0X07H);
  
  IIC_REG_Write(TINTR,0X07H);   //写增益寄存器选择integration时间,这里选择默认值07H即integration时间为8
  IIC_REG_Write(TINTG,0X07H);   //寄存器地址分别为11H,10H,0FH
  IIC_REG_Write(TINTB,0X07H); */
  
  IIC_REG_Write(ACQ,0X02H);     //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
  while(IIC_REG_Read(ACQ));     //ACQ为0时读ADCR,ADCG,ADCB
  data_temp1=IIC_REG_Read(ADCR_);  //读ADCR,ADCG,ADCB寄存器值
  data_temp2=IIC_REG_Read(ADCG);   //地址分别为44H,43H,42H
  data_temp3=IIC_REG_Read(ADCB);
  
  //判断ADC值是否小于191,大于191就必须继续做调整
  if(data_temp1<191&&data_temp2<191&&data_temp3<191)
    return;
  //else //error=1,出现出错提示
}
/********************************************************/

/*****************传感器操作*****************************/
void SENSOR_OPERATION()
{
  XRST=0;   //S313硬件复位
  WAIT();   //等待复位完成
  IIC_REG_Write(SETUP0,0X01H);  //设置开始寄存器SETUP0-4
  IIC_REG_Write(SETUP1,0X01H);  //寄存器地址分别为03H,04H,0CH,0DH,0EH
  IIC_REG_Write(SETUP2,0X01H);
  IIC_REG_Write(SETUP3,0X01H);
  IIC_REG_Write(SETUP4,0X01H);
  
 //以下部分复位后有默认值,故可不设置 
/*IIC_REG_Write(PDASR,0X07H);   //写增益寄存器选择光电二极管大小,这里选择3/4 SIZE
  IIC_REG_Write(PDASG,0X07H);   //寄存器地址分别为0BH,0AH,09
  IIC_REG_Write(PDASB,0X07H);
  
  IIC_REG_Write(TINTR,0X07H);   //写增益寄存器选择integration时间,这里选择默认值07H即integration时间为8
  IIC_REG_Write(TINTG,0X07H);   //寄存器地址分别为11H,10H,0FH
  IIC_REG_Write(TINTB,0X07H); */
  
  //提示:为获取OFFSET,请关闭光源操作,
  IIC_REG_Write(ACQ,0X02H);     //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
  while(IIC_REG_Read(ACQ));     //ACQ为0时读ADCR,ADCG,ADCB
  OFFSET_R=IIC_REG_Read(ADCR_);  //读ADCR,ADCG,ADCB寄存器值
  OFFSET_G=IIC_REG_Read(ADCG);   //地址分别为44H,43H,42H
  OFFSET_B=IIC_REG_Read(ADCB);
  
  //获取传感器值
  SENSOR_VALUE_ACQUIRE();
 }
/********************************************************/

void main(void) 
{
  //  Init_ICS();
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  for(;;) 
  {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -