/*--------------------------------------------------------------------------------------
* 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;
}
基于sopc的iic总线对24LC256读写操作
最新推荐文章于 2024-09-11 10:32:07 发布