【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象:

核心代码:
int main(void)
{
int i,n;
char buffer[];
char i2c_buffer[]; HAL_Init();
system_clock.initialize(); led.initialize();
usart1.initialize();
i2c.initialize(); usart1.printf("Hello! I am iCore1S!\r\n"); //´®¿Ú1Êä³ö
while()
{
if(usart1.receive_ok_flag)
{ //½ÓÊÕÍê³É
usart1.receive_ok_flag = ;
for(i = ;i < ;i++)
{
buffer[i] = tolower(usart1.receive_buffer[i]);
}
n = strlen(buffer);
//±È½Ï½ÓÊÕÐÅÏ¢
if(memcmp(buffer,"ledr",strlen("ledr")) == )
{
//ºìÉ«LEDµãÁÁ
LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledg",strlen("ledg")) == )
{
//ÂÌÉ«LEDµãÁÁ
LED_RED_OFF;
LED_GREEN_ON;
LED_BLUE_OFF;
}
if(memcmp(buffer,"ledb",strlen("ledb")) == )
{
//À¶É«LEDµãÁÁ
LED_RED_OFF;
LED_GREEN_OFF;
LED_BLUE_ON;
}
buffer[]=;//Ìí¼Ó½áÊøÎ»
n=strlen(buffer);
i2c.write_nbyte(0x03,0x8F,buffer,n); //i2c·¢ËÍÊý¾Ý
for(i=;i<;i++);
i2c.read_nbyte(0x03,0x0F,i2c_buffer,0x06);
usart1.printf("%s\n",i2c_buffer);//´®¿Ú1Êä³ö½ÓÊÕµ½µÄÊý¾Ý
}
}
}
module I2C(
input CLK_12M,
input SCL,
inout SDA,
output FPGA_LEDR,
output FPGA_LEDG,
output FPGA_LEDB
);
//-------------------------rst_n----------------------------//
reg rst_n;
reg [:]cnt_rst; always@(posedge CLK_12M)
begin
if(cnt_rst=='d10)
begin
rst_n <= 'd1;
cnt_rst <= 'd10;
end
else cnt_rst <= cnt_rst + 'd1;
end //-------------------------parameter------------------------//
parameter ledr = {'d108,8'd101,'d100,8'd114,'d13},
ledg = {'d108,8'd101,'d100,8'd103,'d13},
ledb = {'d108,8'd101,'d100,8'd98, 'd13},
GINGKO = {'d71,8'd73,'d78,8'd71,'d75,8'd79}; //---------------------------address------------------------//
reg [:]device_address,word_address;
reg [:]m; always@(posedge SCL or negedge rst_n)
begin
if(!rst_n)
begin
device_address <= 'd0;
word_address <= 'd0;
m <= 'd0;
tx_en <= 'd0;
rx_en <= 'd0;
end
else
begin
case(m)
'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7: //接收8位地址
begin
if(!rx_en || !tx_en)
begin
m <= m + 'd1;
device_address <= {device_address[:],SDA};
end
else m <= 'd0;
end
'd8:
begin
if(device_address=='d3 || device_address==8'd2)//识别地址
begin
m <= 'd9;
device_address <= 'd0;
end
else if(tx_ack || rx_ack)//识别应答应答
begin
m <= 'd18;
device_address <= 'd0;
end
else
begin
m <= 'd0;
end
end
'd9,5'd10,'d11,5'd12,'d13,5'd14,'d15,5'd16://接收命令
begin
m <= m + 'd1;
word_address <= {word_address[:],SDA};
end
'd17:
begin
if(word_address == 'h8f)//判断接收命令
begin
rx_en <= 'd1;
device_address <= 'hff;
word_address <= 'd0;
end
else if(word_address == 'h0f)//判断发送命令
begin
tx_en <= 'd1;
word_address <= 'd0;
end
else if(tx_ack)
begin
tx_en <= 'd0;
m <= 'd0;
end
else if(rx_ack)
begin
rx_en <= 'd0;
m <= 'd0;
end
else m <= 'd17;
end
'd18:
begin
m <= 'd0;
end
endcase
end
end
//-----------------------------rx---------------------------//
//接收数据
reg [:]data_in;
reg [:]data;
reg [:]i;
reg rx_en;
reg rx_ack; always@(posedge SCL or negedge rst_n)
begin
if(!rst_n)
begin
data_in <= 'd0;
data <= 'd0;
i <= 'd0;
rx_ack <= 'd0;
end
else if(rx_en)
begin
case(i)
'd0,5'd1,'d2,5'd3,'d4,5'd5,'d6,5'd7://接收8位数据
begin
i <= i + 'd1;
rx_ack <= 'd0;
data_in <= {data_in[:],SDA};
end
'd8:
begin
if(data_in[:]=='h0d)//判断结束为
begin
i <= 'd9;
rx_ack <= 'd1;
data <= data_in;
end
else i <= 'd0;
end
'd9:
begin
i <= 'd0;
rx_ack <= 'd0;
end
default:
begin
i <= 'd0;
end
endcase
end
end //----------------------------data--------------------------//
//对比接收数据
reg [:]led; always@(posedge CLK_12M or negedge rst_n)
begin
if(!rst_n)
begin
led <= 'b111;
end
else
begin
case(data[:])
ledr: led <= 'b011;//红灯亮
ledg: led <= 'b101;//绿灯亮
ledb: led <= 'b110;//蓝灯亮
default:led <= 'b111;//都不亮
endcase
end
end assign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led; //-----------------------------tx---------------------------//
//发送数据
reg [:]data_out;
reg [:]j;
reg [:]tx_cnt;
reg tx_ack;
reg tx_en;
reg sda; always@(posedge SCL or negedge rst_n)
begin
if(!rst_n)
begin
data_out <= GINGKO;
j <= 'd0;
tx_ack <= 'd0;
tx_cnt <= 'd0;
sda <= 'd1;
end
else
begin
case(j)
'd0,4'd1,'d2,4'd3,'d4,4'd5,'d6,4'd7://发送8位书籍
begin
if(tx_en)
begin
j <= j + 'd1;
{sda,data_out[:]} <= data_out;
tx_ack <= 'd0;
end
end
'd8:
begin //发送6次,8位数据(GINGKO)
if(tx_cnt =='d5)
begin
j <= j + 'd1;
tx_ack <= 'd1;
tx_cnt <= 'd0;
end
else
begin
j <= 'd0;
tx_cnt <= tx_cnt + 'd1;
tx_ack <= 'd0;
end
end
'd9:
begin
j <= 'd0;
tx_ack <= 'd0;
data_out <= GINGKO;
end
default:
begin
j <= 'd0;
tx_ack <= 'd0;
data_out <= GINGKO;
end
endcase
end
end assign SDA = (j>='d1 && j<=4'd8)? sda : 'dz; //--------------------------endmodule-----------------------//
endmodule
实验方法及指导书:
链接:http://pan.baidu.com/s/1hs8ErAW 密码:wven

【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验的更多相关文章
- 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...
- 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO. 3.通过串口精灵发送命令可以控制ARM·LE ...
- 【iCore1S 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入
实验现象: iCore1s 双核心板上与FPGA相连的三色LED(PCB上标示为FPGA·LED),按键按下红灯点亮,松开按键红灯熄灭. 核心源代码: module KEY( input CLK_12 ...
- 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...
- 【iCore1S 双核心板_FPGA】例程五:Signal Tapll 实验——逻辑分析仪
核心代码: //--------------------Module_Signal_TapII-------------------// module Signal_TapII( input CLK_ ...
- 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT( input C ...
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...
- 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式
实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...
随机推荐
- 【原创】ABP之IConventionalDependencyRegistra接口分析
类图: 作用: abp中默认把对象的注册分为5中约定注册方式: 1.AbpAspNetCoreConventionalRegistrar public class AbpAspNetCoreConve ...
- Ubuntu18.10&Ubuntu18.04安装Python虚拟环境
Ubuntu18.04版本里面自带了最新的Python3.6.5版本,在安装Python虚拟环境时需注意: 1.首先是安装两个包 pip3 install virtualenv # python虚拟环 ...
- 服务端、实时、大数据、AI计算
服务端.实时.大数据.AI计算,各种各样的计算,计算机本质是什么,计算机的本质是 利用compute的计算速度为人提供更优的计算结果. 所以实时也好,准实时.离线.AI本质上是两个维度,实时准实时强调 ...
- SolidWorks知识积累系列-01
Solidworks学习 1. 基本知识点总结 基准视图 主视图:从前往后看,前视基准 俯视图:从上往下看,上视基准 侧视图:从右向左看,右视基准 草图要求 单封闭性,草图要依附于某个位置 绘制大概形 ...
- Python3面向对象基础
面向对象概述 面向对象 面向对象的世界,引入了对象的概念,对象具有属性:数据,对象具有过程或者方法:成员函数.成员函数的作用就是处理属性. 例子 对象:Car 属性:fuel_level, isSed ...
- 潭州课堂25班:Ph201805201 WEB 之 HTML 第一课 (课堂笔记)
什么是HTML 超文本标记语言(HyperText Markup Language,简称 HTML) HTML 是一门标记语言,标记语言由一套标记标签组成, 学习 HTML,其实就是学习标签 HTML ...
- BZOJ1395 : [Baltic2005]Trip
建立新图,原图中每条边在新图中是点,新图中每个点的点权为$-e[i].c+e[i].b$,边权为$0$. 若$e[i].d\leq e[j].a$,则连一条$i$到$j$的单向边. 对于原图中每个点, ...
- 修改button的可点击区域
需求:在cocos2dx引擎中,button的点击区域和button图片的大小是一样的,但是我需要修改可点击区域的大小和位置,需要修改引擎源码: button提供的接口中并没有和touch相关,but ...
- boost 1.67编译VS2017版本
最近想系统学习并使用一下boost的asio异步网络库,所以需要编译boost库使用,下面简单介绍如何编译. 编译环境 boost1.67版本,windows 10,VS2017 下载boost 建议 ...
- Reading privileged memory with a side-channel
https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html https://devel ...