⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djm2.htm

📁 基于FPGA的嵌入式机器人视觉识别系统模块源代码
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://www.seattlerobotics.org/encoder/200601/article3/djm2.htm -->
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3243" name=GENERATOR></HEAD>
<BODY text=#000000 vLink=#000000 aLink=#0000ff link=#0000b0 
bgColor=#008080><BASEFONT face=Arial color=#ffffff>
<CENTER>
<H2>A Color Vision System for Embedded Robotics Applications</H2></CENTER>
<CENTER>
<H2><A 
href="http://www.seattlerobotics.org/encoder/200601/article3/index.php#djm1" 
target=main>Click here to return to article</CENTER></A>
<P>
<TABLE borderColor=#0080ff cellPadding=10 align=center 
background=djm2.files/grid.gif border=10>
  <TBODY>
  <TR>
    <TD><FONT color=black>
      <CENTER>
      <H4>'C' Processor side I2C Interface:</H4></CENTER>
      <P><PRE>

// FPGA addresses of use.
#define I2C_PRERlo *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x0 + (channel * 0x10)))
#define I2C_PRERhi *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x1 + (channel * 0x10)))
#define I2C_CONTROL *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x2 + (channel * 0x10)))
#define I2C_TX_REG *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x3 + (channel * 0x10)))
#define I2C_RX_REG *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x3 + (channel * 0x10)))
#define I2C_COMMAND *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x4 + (channel * 0x10)))
#define I2C_STATUS *(unsigned char volatile *)(FPGA_BASE_ADDR + (0x4 + (channel * 0x10)))

#define I2C_ENB 0x80
#define I2C_IRQ_EN 0x40

void init_I2c(unsigned int channel) 
{ 
	system_usec_timer = 0;
	delay_usec(10);
	I2C_PRERlo = 99; // (50mhz/(5*100Khz))-1 
	I2C_PRERhi = 0; 
	I2C_CONTROL = (I2C_ENB | I2C_IRQ_EN); // I2C enable + INTERUPT ENABLE
	dprintf("\n\rI2C init ch:%d,val:%d\n\r",channel,(I2C_ENB | I2C_IRQ_EN));
	return; 
}

// defines for the command register
#define I2C_STA 0X80
#define I2C_STO 0x40
#define I2C_RD 0X20
#define I2C_WR 0X10
#define I2C_ACK 0X08
#define I2C_IACK 0x01

// defines for the status register
#define I2C_RxACK 0x80
#define I2C_BUSY 0x40
#define I2C_AL 0x20
#define I2C_TIP 0x02
#define I2C_IRQ 0x01

void i2c_Write(unsigned int channel, unsigned char AA,unsigned char BB,unsigned char CC) 
{ 
	I2C_TX_REG = (AA &lt;&lt; 1);
	I2C_COMMAND = (I2C_WR | I2C_STA);
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\r(ch:%d) for IRQ(%d)...1",channel,I2C_STATUS);
	}
	I2C_COMMAND = I2C_IACK;

	I2C_TX_REG = BB;
	I2C_COMMAND = I2C_WR;
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...2");
	}
	I2C_COMMAND = I2C_IACK;

	I2C_TX_REG = CC;
	I2C_COMMAND = (I2C_STO | I2C_WR);
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...3");
	}
	I2C_COMMAND = I2C_IACK;
	return;
} 

unsigned char i2c_Read(unsigned int channel,unsigned char AA,unsigned char BB) 
{
	unsigned char CC;
	I2C_TX_REG = (AA &lt;&lt; 1);
	I2C_COMMAND = (I2C_STA | I2C_WR);
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...4");
	}
	I2C_COMMAND = I2C_IACK;


	I2C_TX_REG = BB;
	I2C_COMMAND = I2C_WR;
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...5");
	}
	I2C_COMMAND = I2C_IACK;


	I2C_TX_REG = (AA &lt;&lt; 1) + 1;
	I2C_COMMAND = (I2C_STA | I2C_WR);
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...6");
	}
	I2C_COMMAND = I2C_IACK;


	I2C_COMMAND = (I2C_RD | I2C_STO | I2C_ACK);
	while(0 != (I2C_STATUS &amp; I2C_TIP))
	{
		feed_watchdog();
	}
	while(0 == (I2C_STATUS &amp; I2C_IRQ))
	{
		feed_watchdog();
		dprintf("\n\rWaiting for IRQ...7");
	}
	I2C_COMMAND = I2C_IACK;
	CC = I2C_RX_REG;
	return(CC);
}

</PRE>
      <CENTER>
      <H4>And to call it, it looks like this:</H4></CENTER><PRE>// init
	init_I2c(1);
// sample write
	i2c_Write(1,0x24,0x11,( 0x1c | (test_val &lt;&lt; 7))); 
// sample read
	cuck = i2c_Read(1,0x24,0x02); 
	dprintf("\r0x02(0x%x)",cuck);

</PRE></FONT></TR></TBODY></TABLE>
<P>
<CENTER>
<H2><A 
href="http://www.seattlerobotics.org/encoder/200601/article3/index.php#djm1" 
target=main>Click here to return to article</CENTER></A>
<P></H2></P></H2></BASEFONT></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -