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