基于sopc的iic总线对24LC256读写操作

/*--------------------------------------------------------------------------------------
* Include
main函数
*-------------------------------------------------------------------------------------*/
#include <unistd.h>
#include "../inc/iic.h"
#include <stdio.h>
#include "alt_types.h"

int main()
{
alt_u16 i;
alt_u8 dat,dat1;
alt_u8 cnt[]={0x80 , 0x81 ,0x83 , 0x84 ,0x86 , 0x87 , 0x89 , 0x8A};


printf("\nWriting data to 24LC256!\n");

//while(1)
//{ 
for(i=0; i<8; i++)
{ 
dat=cnt[i];
iic.write_byte(i,i, dat);

printf("0x%0x\n", dat);
usleep(10000);
}
// if(i==512)
// { 
// i=0;
// } 
// }
printf("\nReading data from 24LC256!\n");

for(i=0; i<8; i++)
{ 
dat1=0; 
dat1=iic.read_byte(i,i);
printf("0x%0x\n", dat1);
usleep(1000);
} 
return 0;
}
#ifndef IIC_H_
#define IIC_H_


/*--------------------------------------------------------------------------------------
* Define
iic.h
*-------------------------------------------------------------------------------------*/
#define OUT 1
#define IN 0
#define wr 0xa0
#define rd 0xa1
/*--------------------------------------------------------------------------------------
* Struct
*-------------------------------------------------------------------------------------*/
typedef struct{
void (* write_byte)(unsigned short addrh, unsigned short addrl, unsigned char dat);
unsigned char (* read_byte)(unsigned short addrh,unsigned short addrl);
}IIC;

extern IIC iic;
#endif /*IIC_H_*/


/*--------------------------------------------------------------------------------------
* iic.c
*-------------------------------------------------------------------------------------*/

#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>


#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "../inc/iic.h"
alt_u8 tmp;

static alt_u8 read_byte(alt_u16 addrh,alt_u16 addrl);
static void write_byte(alt_u16 addrh,alt_u16 addrl,alt_u8 dat);


/*--------------------------------------------------------------------------------------
* Struct
*-------------------------------------------------------------------------------------*/
IIC iic ={
.write_byte = write_byte,
.read_byte = read_byte
};

/* 
* === FUNCTION ===================================================
* Name: start
* Description: IIC启动
* =================================================================
*/
static void start(void) 
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); 
usleep(5);
}
/* 
* === FUNCTION ===================================================
* Name: uart_send_byte
* Description: IIC停止
* ==================================================================
*/
static void stop(void) 
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);


IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
usleep(10);
}
/* 
* === FUNCTION ===================================================
* Name: ack
* Description: IIC应答
* =================================================================
*/
static void ack(void) 
{
// alt_u8 tt;
alt_u8 tmp=1;
// tt=0;

IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);
usleep(20);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);

do
{
tmp = IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
}while(tmp==1); 
// }while(tmp==1 && tt++<100);

usleep(5);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(10);

}


/* 
* === FUNCTION ===================================================
* Name: iic_write
* Description: IIC写一个字节
* =================================================================
*/
void iic_write(alt_u8 dat) 
{

alt_u8 i, tmp;


IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);


for(i=0; i<8; i++){
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(5);
tmp = (dat & 0x80) ? 1 : 0;
dat <<= 1;
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, tmp);
usleep(5);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(10);
}
} 
/* 
* === FUNCTION ===================================================
* Name: read
* Description: IIC读一个字节
* ==================================================================
*/
static alt_u8 iic_read(void) 
{
alt_u8 i, dat;


IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);


for(i=0; i<8; i++){
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(5);
dat <<= 1;
dat |= IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(5);
}


usleep(5);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);


return dat;
}



/* 
* === FUNCTION ===================================================
* Name: write_byte
* Description: 向EEPROM写一个字节
* =================================================================
*/
static void write_byte(alt_u16 addrh,alt_u16 addrl,alt_u8 dat) 
{

start();
iic_write(wr);
ack();
iic_write(addrh);
ack();
iic_write(addrl);
ack();
iic_write(dat);
ack();
stop(); 
}
/* 
* === FUNCTION ===================================================
* Name: read_byte
* Description: 从EEPROM读一个字节
* =================================================================
*/
static alt_u8 read_byte(alt_u16 addrh,alt_u16 addrl) 
{

alt_u8 dat;
start();
iic_write(wr);
ack();
iic_write(addrh);
ack();
iic_write(addrl);
ack();


start();
iic_write(rd);
ack();
dat = iic_read();

stop(); 


return dat;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值