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