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

📄 main.c

📁 基于飞斯卡尔MC9S08QG8的基本程序开发代码
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */



 

char DATA,temp;


 #define IIC_ERROR_STATUS            0

#define IIC_READY_STATUS            1

#define IIC_HEADER_SENT_STATUS      2

#define IIC_DATA_TRANSMISION_STATUS 3

#define IIC_DATA_SENT_STATUS        4
  
void WriteBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes);
void ReadBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes);

//---- I2C Variables -------------------------------------------------------
unsigned char I2C_STEP; 
unsigned char I2C_DATA_DIRECTION = 0;      /* 1 Transmit, 0 Read */
unsigned char I2C_LENGTH = 1;
unsigned char I2C_COUNTER = 0;

unsigned char I2C_DATA[20];			/* IIC Buffer */

 
void I2c_init(void)
 {	
  
  /* Configure interfaces. Set our IIC adress. */
   IICC_IICEN = 1;           /* Enable IIC_module     */
   IICA =0xA4;       /* IIC Address           */
   IICF = 0x9d;              /* Set IIC frequency     */    
   I2C_STEP = IIC_READY_STATUS;
   IICC_IICIE = 0;          /* Disable IIC_interrupts */
     
  
}
  /********************************************************************************/
 // 
 //       注意:写地址应为0,8,10,18,第个页的首地址,第次写8个字节(24c01类弄芯片) 
 // 
  /********************************************************************************/

void WriteBytesI2C(unsigned char slaveAddress,unsigned char numberOfBytes)
{
	unsigned char Temp; 
  I2C_LENGTH = numberOfBytes;
  I2C_COUNTER =0;
  I2C_STEP = IIC_HEADER_SENT_STATUS;   
  I2C_DATA_DIRECTION = 1;            //自定义变量,千万不要改动此变量,1为发送(写),0为接收(读)
  
  /* Format the Address to fit in the IICA register and place a 0 on the R/W bit.*/
  // slaveAddress &= 0xFE;
    
  IICC_IICEN = 1;             //始能模块   
  IICC_MST = 0; 
  IICC_TX = 1;				         /* Select Transmit Mode 发送,伴随着下面MST从0变1 */
	IICC_MST = 1;
	
  IICD = 0xa0;			          	/* Send slave device selected  address */  
  while(IICS_RXAK); 
  while(!IICS_IICIF);
  Temp = IICS;                /* 先读状态寄存器后写1Clear any pending interrupt*/     
  IICS_IICIF = 1;
    
  IICD = slaveAddress;  
  
  while(IICS_RXAK); 
 
  IICC_IICIE=1;     
   
  return;
}


/****  read from IIc back function ***************/
void ReadBytesI2C (unsigned char slaveAddress,unsigned char numberOfBytes)
{

	unsigned char Temp;
  
  I2C_LENGTH = numberOfBytes;

  I2C_COUNTER =0;
  I2C_STEP = IIC_HEADER_SENT_STATUS;
  I2C_DATA_DIRECTION = 0;      //自定义变量,千万不要改动此变量,1为发送(写),0为接收(读)*/
  
  IICC_MST = 1; 
  IICC_IICEN = 1;             //始能模块    
  IICC_TX = 1;				         /* Select Transmit Mode 发送,伴随着下面MST从0变1 */
	IICC_MST = 1;               /* Select Master Mode (Send Start Bit) 主机模式 */  
      
  IICD = 0xa0;			  	/* Send slave device selected  address  */  
  while(IICS_RXAK); 
  while(!IICS_IICIF);
  Temp = IICS;                /* 先读状态寄存器后写1Clear any pending interrupt*/      
  IICS_IICIF = 1;
    
  IICD = slaveAddress;  
  
  while(IICS_RXAK); 
  while(!IICS_IICIF);
  Temp = IICS;                /* 先读状态寄存器后写1Clear any pending interrupt */
  IICS_IICIF = 1;  
  IICC_RSTA=1;                //重新启动
   
  IICC_IICIE=1;
  IICD = 0xa1; 
                
  return;
}

/* Interrupt handler routine to manage all the events related
 * to the IIC module.    */


interrupt 24 void Viic_isr(void)
{

	unsigned char Temp;
  
  //************************* 清除中断事件位 ********************************
	Temp = IICS;              /* ACK the interrupt */
  IICS_IICIF = 1;           //清除中断事件位/
  //********************************************************/
  if(IICS_ARBL==1)         //=1,则总线总载失败/
  {                 /* Verify the Arbitration lost status */	     
	     IICS_ARBL= 1;
	     IICC_MST = 0;	
	     I2C_STEP = IIC_ERROR_STATUS;       
	     return;     
	}										       /* If Arbitration is OK continue */  
//*************************************************************************//	 
	if(IICC_MST==1)                      //如果为master模式.*/
	   {                                 /* If we are the IIC Master */
	 
	 				 	 
	 	   if(IICS_RXAK==1)                   //==1说明没有收到应答信号/
	 	     {  
	 	       if(I2C_LENGTH ==I2C_COUNTER) return;
	 	       else
	 	        {   	 	         
	 	          IICC_MST = 0;
	            I2C_STEP = IIC_ERROR_STATUS; 
	            return;     //没有收到从机的应答信号则返回*/
	 	        }          
	 	     }             	 			             
     
      if(I2C_STEP == IIC_HEADER_SENT_STATUS) //如果上一个字节发的是命令字//
        {                                    /* Header Sent */
          IICC_TX = I2C_DATA_DIRECTION;
          
          I2C_STEP = IIC_DATA_TRANSMISION_STATUS; 
          
          if(IICC_TX==0)
          {                          /* If we are reading data clock in first slave byte */
              Temp = IICD;
              return;
          }
        }
              
       if(I2C_STEP == IIC_DATA_TRANSMISION_STATUS)
          {	 /* If byte transmision is in progress.*/
           
        	    if(IICC_TX==1)            //如果为写模式状态*************************
        	      {				                       	       
        	        
        	       if(I2C_COUNTER>=I2C_LENGTH)       //如果接收完毕,则进行以下操作
        	         {   
        	          I2C_STEP=IIC_READY_STATUS;	             /* 复位I2C_STEP的状态=空闲状态Reset our status flag            */
        	          Temp = IICS;                            /* ACK the interrupt                */
                    IICS_IICIF=1; 
                    IICC_TX=0;
        	          IICS_SRW=0; 
        	          while(IICS_RXAK);
        	          IICC_MST=0;  //see aw16.pdf P222 MST bit 说明,此操作将产生一个停止信号        	           
        	          return;           	    				 
        	         }
        	       else
        	        {        	        
        	         IICD =I2C_DATA[I2C_COUNTER];	     /* Send the next byte */        	         	 
        	         I2C_COUNTER++; 
        	        }
        	           
        	      } 
        	    else                  //否则为接收状态 *********************************
        	      {		 
        	        if((I2C_COUNTER+1)== I2C_LENGTH)  /* Master should not ACK the last byte */
        	        IICC_TXAK = 1;			  /* =1说明如果接收完.就不给从机发应答信号,否则自动发送应答信号!!!*/        
        	      				
        	        I2C_DATA[I2C_COUNTER] = IICD;	     /* Read the next byte */       	         	 
        	        I2C_COUNTER++;
        	        
        	      											 
        	        if(I2C_LENGTH ==I2C_COUNTER)       //如果接收完毕,则进行以下操作
        	         {        	          
        	          IICC_MST=0; //see aw16.pdf P222 MST bit 说明,此操作将产生一个停止信号 
        	          I2C_STEP=IIC_READY_STATUS;	             /* 复位I2C_STEP的状态=空闲状态Reset our status flag            */
        	          Temp = IICS;                            /* ACK the interrupt                */
                    IICS_IICIF=1; 
                    IICC_TX=0;
        	          IICS_SRW=0;          	          
        	          IICC_IICIE=0 ;        	        /* Mark we are done sending Bytes */  
        	          IICC_IICEN = 0;
        	           return;           	    				 
        	         }	  
        	      }
        	        
          }
                   
             
    }
if(IICC_MST==0) /*************************************************************/
 {			 /*  如果为从模式(接收)as slve mode */  
                   																						 

         if(I2C_STEP <= IIC_READY_STATUS)
           {	 				 /* If it is the first byte tranmited */
             I2C_STEP = IIC_DATA_TRANSMISION_STATUS;
             IICC_TX = IICS_SRW;				           /* Set the transmision reception status */
             I2C_COUNTER = 1;
           
             /* If we are receiving data read IICD to get free bus and get the next byte */
             if(IICC_TX==0) 
            {
              Temp = IICD;
              return;
            }
          }
       	
       
			   if(IICS_TCF==1)
			    {
            if(IICC_TX == 0)
             {	        /* If data is received store it on the buffer */              
              I2C_DATA[I2C_COUNTER]=IICD;
              I2C_COUNTER++;
              return;          
             } 
            else
             {	                      /* Data sent by the slave */              
              
               if(IICS_RXAK==1)
               {      /* If byte is not ACK end transmision. */
	                IICC_TX = 0;
	                Temp = IICD;
	                I2C_STEP = IIC_READY_STATUS;
	                return;
	 	           }
              
              IICD = I2C_DATA[I2C_COUNTER];
              I2C_COUNTER++;
              return;          
            }
		      }
   }
}


⌨️ 快捷键说明

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