您的位置:首页 > 运维架构

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

2013-11-20 15:14 302 查看
/*--------------------------------------------------------------------------------------
* 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: