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

📄 i2c_slave.c

📁 i2c slave on freescale hcs12 micro-controller for codewarrior
💻 C
字号:
#include <mc9s12e128.h>     /* derivative information */
#include "i2c_slave.h"


/* Bits peripheral register access macros */
#define testReg8Bits(RegName, GetMask)                           (RegName & (GetMask))
#define clrReg8Bits(RegName, ClrMask)                            (RegName &= ~(byte)(ClrMask))
#define setReg8Bits(RegName, SetMask)                            (RegName |= (byte)(SetMask))

/* Whole peripheral register access macros */
#define setReg8(RegName, val)                                    (RegName = (byte)(val))

#define MAX_BUFFER 8
#define FALSE 0
#define TRUE 1

unsigned char address = 0;
int address_flag = 0;
unsigned char IIC_Data[MAX_BUFFER] = {0, 1, 0, 2, 0, 3, 0, 4};
char j = 1;

void i2c_init ( void)
{
  /* Set pull up PERM7=1, PERM6=1 */
  PERM = 0xf0;
  /* Set open drain */
  WOMM = 0xc0;
  
	//IBFD = 0xff; 			/* frequency divider register */
	//IBFD = 0x31; 			/* frequency divider register */
	//IBAD = 0xA0;             /* slave address of this module */
	//IBCR = (IBEN|IBIE);  	/* enable Iic module */
	
	  /* IBCR: IBIE=0 */
  IBCR_IBIE = 0;               /* Disable interrupts before change */ 
  /* IBSR: IBIF=1 */
  IBSR_IBIF=1;                /* Clear the interrupt flag */ 
  /* IBFD: IBC7=1,IBC6=0,IBC5=0,IBC4=0,IBC3=0,IBC2=0,IBC1=0,IBC0=0 */
  //IBFD = 128;                  /* Timing setting */ 
  IBFD = 0x18; //100 kHz
  //IBFD = 0x38; //6.25 kHz
  /* IBAD: ADR7=0,ADR6=0,ADR5=0,ADR4=0,ADR3=0,ADR2=0,ADR1=1,??=0 */
  IBAD= 0x50;                    /* Slave address setting */ 
  /* IBCR: IBEN=1 */
  setReg8Bits(IBCR, 128);              /* Enable the module */ 
  /* IBCR: IBEN=1,IBIE=1,MS_SL=0,TX_RX=0,TXAK=0,RSTA=0,??=0,IBSWAI=0 */
  setReg8(IBCR, 192);
  
}


void __interrupt 31 isrViic(void)
{
PTT = 0xff;
led_control();

    IBSR_IBIF = 1;
    if (IBSR_IBAL) {
        IBSR_IBAL = 1;
        if (IBSR_IAAS) {
            SRW();
        }
    }
    else {
       if (IBSR_IAAS) {                // 
        SRW();
        }
        else {

            if (IBCR_TX_RX) {                // Check for rec ACK
            //if (IBSR_SRW) {
              //IBCR_TX_RX = 1;
                if (!IBSR_RXAK) {             // ACK Recieved
                //IBDR = IIC_Data[address];
                //PTT = IIC_Data[address];
                IBDR = 0xff;
                PTT = 0xff;
                address++;
                if (address == MAX_BUFFER)
                    address = 0;
                }
            else {            
                IBCR_TX_RX = 0;             // No ACK 
                IBDR;
            }
            }
            else {
            //IBCR_TX_RX = 0;            
            Slave_Read();
            }
        }
    }
}

void SRW(void) {

    if (IBSR_SRW) {      // Check for Slave rec or transmit
        IBCR_TX_RX = 1;        // Set Tx bit to begin a Transmit
        IBDR = IIC_Data[address];
        address++;
        if (address == MAX_BUFFER)
            address = 0;
    }
    else {
        IBCR_TX_RX = 0;
        IBDR;            //Dummy read
        address_flag = 0;
    }
}

void Slave_Read(void) {
  if(address_flag) {
  IIC_Data[address] = IBDR;
  address++;
  if (address == MAX_BUFFER)
    address = 0;
  } else {
    address = IBDR;
    address_flag = 1;
  }
}

void led_control(void) 
{
    if (bitmask == 0){
    PTT = PTT & 0x7f;
    bitmask = 1;
    } else {
    PTT = PTT | 0x80;
    bitmask = 0;
    }

    //for (j=0; j< 65535; j++);
}

⌨️ 快捷键说明

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