#include <io.h>
#include <stdio.h>
#include <system.h>
#include <alt_types.h>
#include "altera_avalon_pio_regs.h"
#include <unistd.h>
#define DELAY_TIME 1
#define Set_SDA IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x1)
#define Clr_SDA IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x0)
#define Set_SCL IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x1)
#define Clr_SCL IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x0)
//void delay(unsigned int value)
//{
// unsigned int i;
// for(i=0;i<value;i++)
// ;
//}
void I2C_Start(void)
{
/* SDA -------_________
SCL ------------____ */
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
Set_SDA; //SDA = 1
Set_SCL; //SCL = 1
usleep(DELAY_TIME);
Clr_SDA; //SDA = 0
usleep(DELAY_TIME);
Clr_SCL; //SCL = 0
usleep(DELAY_TIME);
}
void I2C_Send_Byte(unsigned char data)
{
/* MSB
SDA ______-------------__________
SCL _________-------_____________ */
unsigned char i = 8;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
//IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
Clr_SDA;
Clr_SCL;
usleep(DELAY_TIME);
while( i-- )
{
if (data&0x80)
Set_SDA;
else
Clr_SDA;
usleep(DELAY_TIME);
Set_SCL;
usleep(DELAY_TIME);
Clr_SCL;
usleep(1);
Clr_SDA;
usleep(DELAY_TIME);
data = data << 1;
}
}
void Check_Ack(void)
{
/* SDA ____zzzzzzzzzzzzz
SCL ____------_______ */
unsigned char a=1;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0);
//IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
//Set_SDA; // SDA = "Z" for input model
a = 1;
usleep(DELAY_TIME);
Set_SCL; // SCL = 1
//usleep(DELAY_TIME);
a=IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(DELAY_TIME);
/* Clr_SCL;
delay(DELAY_TIME);
if(a==1)
printf("not receive ack\n");
else
printf("receive ack\n"); */
while(a)
{
a=IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(DELAY_TIME);
}
Clr_SCL;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
Clr_SDA;
usleep(40);
}
void I2C_Stop(void)
{
/* SDA _________--------
SCL ____------------- */
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
//IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
usleep(2);
Clr_SDA; //SDA = 0
Clr_SCL; //SCL = 0
usleep(3);
Set_SCL; //SCL = 1
usleep(3);
Set_SDA; //SDA = 1
usleep(3);
Clr_SCL; //SCL = 0
usleep(3);
}
unsigned char I2C_Receive_Byte(void)
{
unsigned char rn = 0, data=0,rr=0x80;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0); //input model
//IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
Clr_SCL;
//Set_SDA; //SDA = "Z"
usleep(DELAY_TIME);
for(rn=0;rn<8;rn++)
{
Set_SCL;
usleep(DELAY_TIME);
if (IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE))
data|=rr;
else
data&=~rr;
usleep(DELAY_TIME);
rr>>=1;
Clr_SCL;
usleep(DELAY_TIME);
}
usleep(5);
return data;
}
//void I2C_Ack(void)
//{
// /* SDA _________________
// SCL ____------_______ */
// IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
// IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
// Clr_SDA;
// delay(DELAY_TIME);
// Set_SCL;
// delay(DELAY_TIME);
// Clr_SCL;
// delay(DELAY_TIME);
//}
void I2C_Nack(void)
{
/* SDA ___--------_____
SCL ____------_______ */
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
//IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
Set_SDA;
usleep(DELAY_TIME);
Set_SCL;
usleep(DELAY_TIME);
Clr_SCL;
usleep(1);
Clr_SDA;
usleep(DELAY_TIME);
}
//----------------------------------------------------------------------------
//write a byte data in ram
//----------------------------------------------------------------------------
void single_byte_write(unsigned char MSB, unsigned char LSB, unsigned char DATA)
{
I2C_Start();
I2C_Send_Byte(0xa0);
Check_Ack();
I2C_Send_Byte(MSB);
Check_Ack();
I2C_Send_Byte(LSB);
Check_Ack();
I2C_Send_Byte(DATA);
Check_Ack();
I2C_Stop();
}
//----------------------------------------------------------------------------
//read a byte data from ram
//----------------------------------------------------------------------------
unsigned char single_byte_read(unsigned char MSB)
{
unsigned char data_temp;
I2C_Start();
I2C_Send_Byte(0xba);
Check_Ack();
I2C_Send_Byte(MSB);
// Check_Ack();
// I2C_Send_Byte(LSB);
Check_Ack();
I2C_Start();
I2C_Send_Byte(0xbb);
Check_Ack();
data_temp = I2C_Receive_Byte();
I2C_Nack();
I2C_Stop();
return data_temp;
}
//write multiply byte into RAMTRON
void write_multi_byte (unsigned char MSB, unsigned char LSB, unsigned char *pdata)
{
unsigned char data_size = 0;
unsigned char temp_data = (*pdata);
unsigned char i;
while(temp_data > 0 )
{
data_size++;
temp_data = *(pdata + 1);
}
I2C_Start();
I2C_Send_Byte(0xa0);
Check_Ack();
I2C_Send_Byte(MSB);
Check_Ack();
I2C_Send_Byte(LSB);
Check_Ack();
//write data
for(i = 0; i < data_size; i++)
{
I2C_Send_Byte(*(pdata + i));
Check_Ack();
}
I2C_Stop();
}
//read multi byte from RAMTRON
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
hello_I2C.rar (5个子文件)
i2c.c 6KB
write_register.h 350B
write_register.c 2KB
hello_world.c 1KB
i2c.h 462B
共 5 条
- 1
资源评论
- xxhh19192014-04-08很有用,通过延时来做时序
- xiaolin1988322014-08-07没有用对我
- WESTMULAN2013-06-09太有用了,受益匪浅!
- wangxun79952013-04-11这个真不错,希望你再接再厉地多发点资料。
addquerry
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功