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

📄 main.c

📁 用于Slave I2C得读写,此代码针对特定得芯片,但对其他得芯片也有借鉴作用.
💻 C
字号:
#define ALLOCATE_EXTERN

#include "DP8051.h"
#include "intrins.h"
#include "FS7822.h"

#define SLAVE_ADDRESS  0xAE
//  I2C_CLK reg
#define bmI2CCK_DIV       0x54
#define bmCLK_PRE         0x40

#define I2C_EN			0x80
#define I2C_MODE		0x40
#define MST_MODE		0x20
#define START			0x02
#define STOP			0x01

void I2c_Init(BOOL isHigh);
void InitCPU();
BYTE I2c_SendStr(BYTE sla,BYTE *s,BYTE doffset,WORD no);
BYTE I2c_RcvStr(BYTE sla,BYTE *s,BYTE doffset,WORD Len);
void I2C_Write(unsigned char *input,unsigned short wordadd,unsigned char Len);
void I2C_Read(unsigned char *output,unsigned short wordadd,unsigned char Len);
void I2C_WriteRead(unsigned char *input,unsigned char *output,unsigned short wordadd,unsigned char Len);

void InitCPU()
{
	SYS_CFG=bmCPUCLK_SEL|bmPM_AVBLE|bmSYS_SWRST; //select system  clock,firmware dispose USB request, reset the device
    
    SYSIO_CFG=bmSPI_EN|bmI2C_EN;

	SW_RST=bmSPI_RST|bmI2C_RST;

	BPPUCTL=bmSPIPUCTL;
   
	MEMCON=bmMEMCON|bmASYN;  
    WDTRST = 0x2D;   
}

void I2c_Init(BOOL isHigh)
{
    SW_RST|=bmI2C_RST;

    if(isHigh)
          I2C_CLK = bmI2CCK_DIV;                     //400k
    else
          I2C_CLK = bmCLK_PRE|bmI2CCK_DIV;           //100k
		
	I2C_CTL |= 0x40;             //Slave     
	I2C_MABT = 0x01;          
}


idata BYTE writedata[30] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,\
                         0xBB,0xBA,0xCC,0xDD,0xEE,0xFF,0xAB,0xBC,0xCD,0xDE};
idata BYTE readdata[30];

#define Address_match  0x80
#define Slave_mode     0x40
BYTE datanum;
void    WriteData(BYTE * writedata);
void    ReadData(BYTE * readdata);

void    WriteData(BYTE * writedata)
{
     I2C_STUS = 0x03;
     I2C_DBUF = *writedata;
}

void    ReadData(BYTE * readdata)
{
     *readdata = I2C_DBUF;
     I2C_STUS = 0x01;
}

void I2C_INT_ISR(void) interrupt 7 
{
     if(CHIPINT & I2CINTE)
     {
         CHIPINT &= ~I2CINTE;
         if(I2C_STUS & Slave_mode)
         {                    
               WriteData(writedata+datanum);               
         }
         else
         {
               ReadData(readdata+datanum);
         } 
         datanum++;
     }    
}
main()
{
     WDTRST = 0x2D;
     InitCPU();
     I2c_Init(0);
      
     EA = 1;
     ES = 1;
     I2C_SADDR = 0xEA;
     CHIPINTE = CHIPINTE | I2CINTE;
     while(1)
     {
         if(datanum == 20)
            datanum = 0;
     }
}

⌨️ 快捷键说明

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