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

📄 iic2.txt

📁 富士通单片机的iic源码 原创! 精华
💻 TXT
字号:
/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
/* ELIGIBILITY FOR ANY PURPOSES.                                             */
/*                 (C) Fujitsu Microelectronics Europe GmbH                  */
/*---------------------------------------------------------------------------
  MAIN.C
  - description
  - See README.TXT for project description and disclaimer.

/*---------------------------------------------------------------------------*/



#include "mb90350.h"

unsigned char EEPROM_ERROR;

#define SCL PDR4_P45
#define SDA PDR4_P44
#define SCL_DIRE DDR4_D45
#define SDA_DIRE DDR4_D44 


void UART_sendbyte (char ch);
char byteout();
void delay(int time);

/* 定义一个中间变量trans 通过移位来实现串行输入 */
union {
char byte;
struct
{char bit0:1;
char :6;
char bit7:1;
} bit;
} trans;

void initiic() /* 初始化SDA,SCL */
{
SCL=0; /* SCL=0 */
SDA=0; /* SDA=0 */
SCL_DIRE=1; /* SCL 方向: 输出 */
SDA_DIRE=1; /* SDA 方向: 输出 */
}
void begintrans() /* 发送START 信号 */
{
SDA=1; /* SDA=1 */
SDA_DIRE=1; /* SDA 方向为输出到EEPROM */
SCL=1; /* SCL=1 */
SDA=0; /* SDA=0 */
}
void stoptrans() /* 发送STOP 信号 */
{
SDA=0; /* SDA=0 */
SDA_DIRE=1; /* SDA 方向为输出到EEPROM */
SCL=1; /* SCL=1 */
SDA=1; /* SDA=1 */
delay(0x02);
}
void ack() /* 等待EEPROM 的ACK 信号 */
{
char d;
SDA_DIRE=0; /* SDA 方向为从EEPROM 输入 */
SCL=1; /* SCL=1 */
do
{ d=SDA; }
while(d==1); /* 等待EEPROM 输出低电平 */
SCL=0; /* SCL=0 */
}
void bytein(char ch) /* 向EEPROM 写入一个字节 */
{
int i;
trans.byte=ch;
SCL=0; /* SCL=0 */
SDA=trans.bit.bit7; /* 数据首位MSB */
SDA_DIRE=1; /* SDA 方向为输出到EEPROM */

for(i=8;i>0;i--)
{
SDA=trans.bit.bit7; /* 数据通过SDA 串行移入EEPROM */
SCL=1; /* SCL=1 */
trans.byte=trans.byte*2;
SCL=0; /* SCL=0 */
}
ack();
}
void writebyte(char addr,char data) /* 向EEPROM 指定地址写入一个字节的数据 */
{
begintrans();
bytein(0xA0); /* 写入写控制字0xA0 */
bytein(addr); /* 写入指定地址 */
bytein(data); /* 写入待写入EEPROM 的数据 */
stoptrans();
delay(0x5FF); /* 延时 10ms */
}
char readbyte(char addr) /* 从EEPROM 指定地址读取一个字节的数据 */
{
	char c;
	begintrans(); /* START */
	bytein(0xA0); /* 写入写控制字0xA0 */
	bytein(addr); /* 写入指定地址 */
	begintrans(); /* START */
	bytein(0xA1); /* 写入读控制字0xA1 */
	c=byteout(); /* 读出EEPROM 输出的数据 */
	stoptrans(); /* STOP */
	return(c);
}

char byteout() /* 从EEPROM 输出一个字节 */
{
	int i;
	char ch;
	SDA_DIRE=0; /* SDA 的方向为从EEPROM 输出 */
	for(i=8;i>0;i--)
	{
		trans.byte=trans.byte*2;
		SCL=1; /* SCL=1 */
		trans.bit.bit0=SDA; /* 数据通过SDA 串行移出EEPROM */
		SCL=0; /* SCL=0 */

	}
	ch=trans.byte;
	return(ch);
}



void delay(int time) /* 延时函数 */
{
	for(;time>0;time--);
}


/*****************************************************************************/
/* UART                                                                      */
/*****************************************************************************/

void InitUart3(void)
{
  // Initialize UART3 asynchronous mode
  BGR3 = 1666; 										// 9600 Baud @ 16MHz
  SCR3 = 0x17; 										// 8N1
  SMR3 = 0x0d; 										// enable SOT3, Reset, normal mode
  SSR3 = 0x02; 										// LSB first		Enables Reception Interrupt
  DDR1_D12 = 0;										// enable  SIN3  SET  MOD-> IN
}//end InitUart3



void UART_sendbyte (char ch)
{
  while (!SSR3_TDRE); 
  TDR3 = ch;		      
}

char UART_readbyte_wait (void)
{
  while(!SSR3_RDRF);  								// wait, until byte is received
  return (RDR3);      								// return received byte
}

void UART_sendstring (const char *string)
{
  unsigned int i;
	
  for (i=0; i<strlen(string); i++) 
  {
    if (string[i] == 10)
      UART_sendbyte(13);
    UART_sendbyte(string[i]);
  }
}

void delay1(unsigned int i)
{
	volatile unsigned int j;
	i = i * 120;
	for (j=0; j<i; j++);
}






void main(void)
{
 
 	unsigned char ch1;
 	unsigned char ch2;
 
  	InitIrqLevels();
  	__set_il(7);      // allow all IQR levels
  	__EI();           // globaly enable interrupts
  
  	

	InitUart3();
	initiic();
	
	
	DDR1_D10 = 1;	
	
	
	
	PDR1_P10 = 1;
	delay1(1000);
	PDR1_P10 = 0;
	
	//UART_sendbyte(0x10);
	writebyte(0x10,'a');/* 向EEPROM 的地址0x20 写入数据a */
	writebyte(0x11,'b');/* 向EEPROM 的地址0X21 写入字符b */
	ch1=readbyte(0x10); /* 读出EEPROM 地址单元0x20 的数据 */
	ch2=readbyte(0x11); /* 读出EEPROM 地址单元0X21 的数据 */
	

	UART_sendbyte(ch1);
	UART_sendbyte(ch2); /* 将读出的数值发送出去 */
	UART_sendbyte(0x10);
	while(1);

}

⌨️ 快捷键说明

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