/*
* "Hello World" example.
*
* This example prints 'Hello from Nios II' to the STDOUT stream. It runs on
* the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example
* designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT
* device in your system's hardware.
* The memory footprint of this hosted application is ~69 kbytes by default
* using the standard reference design.
*
* For a reduced footprint version of this template, and an explanation of how
* to reduce the memory footprint for a given application, see the
* "small_hello_world" template.
*
*/
#include <stdio.h>
#include "io.h"
#include "system.h"
#include "alt_types.h"
alt_16 abc[100];
alt_u8 i;
typedef struct
{
alt_u32 GO;
alt_u32 OK;
alt_u32 MODE;
alt_u32 CNTDELTA;
alt_u32 WRDAT;
alt_u32 RDDAT;
}I2C_STR;
#define SLAVE_BASE I2C_ADS1115_BASE
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define SET_GO (IOWR(SLAVE_BASE,0,1))
#define CLR_GO (IOWR(SLAVE_BASE,0,0))
#define RESPOND_ST 0
#define RESPOND_TRANSMIT 1
#define RESPOND_OK 2
#define OK_RESPOND (IORD(SLAVE_BASE,1))
#define ST_MODE 1
#define TRANSMIT_MODE 2
#define END_MODE 3
#define SET_MODE(mode) (IOWR(SLAVE_BASE,2,mode))
#define CNT_100K 17179869
#define SET_CNTDELTA(cntdelta) (IOWR(SLAVE_BASE,3,cntdelta))
#define SET_WRDAT(wrdat) (IOWR(SLAVE_BASE,4,(wrdat<<1)+1))
#define SET_RDDAT (IOWR(SLAVE_BASE,4,0x1fe))
#define RD_DAT (IORD(SLAVE_BASE,5))
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define slave_addr 0x48
/***********************************************************
* 产生一个开始信号
***********************************************************/
void ST_I2C()
{
SET_MODE(ST_MODE);
SET_GO;
while(OK_RESPOND!=RESPOND_OK);
CLR_GO;
/*
IOWR(I2C_ADS1115_BASE,2,1);
IOWR(I2C_ADS1115_BASE,0,1);
while(IORD(I2C_ADS1115_BASE,1)!=2);
IOWR(I2C_ADS1115_BASE,0,0);
*/
}
/***********************************************************
* 产生一个结束信号
***********************************************************/
void END_I2C()
{
SET_MODE(END_MODE);
SET_GO;
while(OK_RESPOND!=RESPOND_OK);
CLR_GO;
SET_MODE(ST_MODE);
while(OK_RESPOND!=RESPOND_ST);
/*
IOWR(I2C_ADS1115_BASE,2,3);
IOWR(I2C_ADS1115_BASE,0,1);
while(IORD(I2C_ADS1115_BASE,1)!=2);
IOWR(I2C_ADS1115_BASE,0,0);
IOWR(I2C_ADS1115_BASE,2,1);
while(IORD(I2C_ADS1115_BASE,1)!=0);
*/
}
/***********************************************************
* 发送八位数据,返回ACK
***********************************************************/
alt_u8 WR_I2C(alt_u16 wrdat)
{
alt_u8 ACK;
SET_WRDAT(wrdat);
SET_MODE(TRANSMIT_MODE);
SET_GO;
while(OK_RESPOND!=RESPOND_OK);
ACK=RD_DAT&0X01;
CLR_GO;
while(OK_RESPOND!=RESPOND_ST);
return ACK;
/*
alt_u8 ACK;
IOWR(I2C_ADS1115_BASE,4,(wrdat<<1)+1);
IOWR(I2C_ADS1115_BASE,2,2);
IOWR(I2C_ADS1115_BASE,0,1);
while(IORD(I2C_ADS1115_BASE,1)!=2);
ACK=IORD(I2C_ADS1115_BASE,5)&0X01;
IOWR(I2C_ADS1115_BASE,0,0);
while(IORD(I2C_ADS1115_BASE,1)!=0);
return ACK;
*/
}
/***********************************************************
* 接收八位数据,响应ACK
***********************************************************/
alt_u8 RD_I2C()
{
alt_u8 dat;
SET_RDDAT;
SET_MODE(TRANSMIT_MODE);
SET_GO;
while(OK_RESPOND!=RESPOND_OK);
dat=RD_DAT>>1;
CLR_GO;
while(OK_RESPOND!=RESPOND_ST);
return dat;
/*
alt_u8 dat;
IOWR(I2C_ADS1115_BASE,4,0x1fe);
IOWR(I2C_ADS1115_BASE,2,2);
IOWR(I2C_ADS1115_BASE,0,1);
while(IORD(I2C_ADS1115_BASE,1)!=2);
dat=IORD(I2C_ADS1115_BASE,5)>>1;
IOWR(I2C_ADS1115_BASE,0,0);
while(IORD(I2C_ADS1115_BASE,1)!=0);
return dat;
*/
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void WR_ADS1115(alt_u8 addr,alt_u16 dat)
{
alt_u8 ACK=0;
do
{
ACK=0;
ST_I2C();
ACK|=(WR_I2C(slave_addr<<1));
ACK|=WR_I2C(addr);
ACK|=WR_I2C((dat>>8));
ACK|=WR_I2C(dat);
END_I2C();
}while(ACK);
}
alt_16 RD_ADS1115(alt_u8 addr)
{
alt_u8 ACK=0;
alt_16 dat;
do
{
ACK=0;
ST_I2C();
ACK|=(WR_I2C(slave_addr<<1));
ACK|=WR_I2C(addr);
END_I2C();
ST_I2C();
ACK|=(WR_I2C((slave_addr<<1)+1));
dat=RD_I2C();
dat=(dat<<8)+RD_I2C();
END_I2C();
// delay(10);
}while(ACK);
return dat;
}
void ads1115_init()
{
CLR_GO;
SET_MODE(ST_MODE);
SET_CNTDELTA(CNT_100K*10); //1MHz
WR_ADS1115(0x01,0xc083);
WR_ADS1115(0x02,0x4444);
WR_ADS1115(0x03,0x5555);
/*
IOWR(I2C_ADS1115_BASE,0,0);
IOWR(I2C_ADS1115_BASE,2,1);
IOWR(I2C_ADS1115_BASE,3,17179869.184*10);
WR_ADS1115(0x01,0xc083);
WR_ADS1115(0x02,0x4444);
WR_ADS1115(0x03,0x5555);
*/
}
int main()
{
i=0;
printf("Hello from Nios II!\n");
IOWR(CNTMAX_BASE,0,4);
IOWR(LED_BASE,0,0XAA);
ads1115_init();
IOWR(LED_BASE,0,0X01);
while(1)
{
printf("%d\t ",RD_ADS1115(0));
printf("%x\t ",RD_ADS1115(1));
printf("%x\t ",RD_ADS1115(2));
printf("%x\t ",RD_ADS1115(3));
printf("\n");
delay(1000000);
}
return 0;
}
I2C_MODULE.rar_i2c_i2c master_i2c master vhdl_i2c vhdl
版权申诉
119 浏览量
2022-09-19
20:37:02
上传
评论
收藏 5KB RAR 举报
小波思基
- 粉丝: 74
- 资源: 1万+