14# shixiaowei7758
这是我的代码,你可以帮我看哈
#define dly1 10
#define dly2 5
/********************************
* 函数名称: start()
* 函数功能: I2C启动
* 输入参数: 无
* 返回值 : 无
*******************************/
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(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
usleep(dly2);
}
/************************
* 函数名称: stop()
* 函数功能: I2C停止
* 输入参数: 无
* 返回值 : 无
*********************/
static void stop(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly2);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
usleep(dly1);
}
/************************
* 函数名称: ack()
* 函数功能: I2C应答
* 输入参数: 无
* 返回值 : 无
*********************/
static void ack(void)
{
alt_u8 tmp;
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly2);
tmp = IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(dly2);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
}
/************************
* 函数名称: iic_write()
* 函数功能: I2C写一个字节的数据
* 输入参数: dat
* 返回值 : 无
*********************/
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(dly2);
tmp = (dat & 0x80) ? 1 : 0;
dat <<= 1;
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, tmp);
usleep(dly2);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly1);
}
// IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
// IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
// usleep(dly2);
}
/************************
* 函数名称: iic_read()
* 函数功能: I2C读取一个字节的数据
* 输入参数: 无
* 返回值 : dat(即读取到的数据)
*********************/
static alt_u8 iic_read(void)
{
alt_u8 i, dat = 0;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);
for(i=0; i<8; i++){
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly2);
dat <<= 1;
dat |= IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(dly2);
}
usleep(5);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
return dat;
}
/************************
* 函数名称: write_byte()
* 函数功能: 向AD5242写一个字节数据dat
* 输入参数: alt_u8 dat
* 返回值 : 无
************************/
static void write_byte(alt_u8 dat)
{
alt_u8 cmdwrite;
alt_u8 instruction;
cmdwrite=0x58;//器件地址AD0=0;AD1=0;而硬件的这两个管脚都接地
instruction=0x00;
start();
iic_write(cmdwrite);
ack();
iic_write(instruction);
ack();
iic_write(dat);
ack();
stop();
}
/************************
* 函数名称: read_byte()
* 函数功能: 从AD5242的addr地址读取一个字节数据
* 输入参数: 无
* 返回值 : alt_u8 dat
***********************/
static alt_u8 read_byte(void)
{
alt_u8 cmdread,dat;
cmdread= 0x59;
start();
iic_write(cmdread);
ack();
dat = iic_read();
stop();
return dat;
} |