【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象:
核心代码:
int main(void) {int i,n;char buffer[20];char i2c_buffer[20];HAL_Init();system_clock.initialize();led.initialize();usart1.initialize(115200);i2c.initialize();usart1.printf("Hello! I am iCore1S!\r\n"); //´®¿Ú1Êä³öwhile(1){if(usart1.receive_ok_flag){ //½ÓÊÕÍê³Éusart1.receive_ok_flag = 0;for(i = 0;i < 20;i++){buffer[i] = tolower(usart1.receive_buffer[i]);}n = strlen(buffer);//±È½Ï½ÓÊÕÐÅÏ¢if(memcmp(buffer,"ledr",strlen("ledr")) == 0){//ºìÉ«LEDµãÁÁ LED_RED_ON;LED_GREEN_OFF;LED_BLUE_OFF;}if(memcmp(buffer,"ledg",strlen("ledg")) == 0){//ÂÌÉ«LEDµãÁÁ LED_RED_OFF;LED_GREEN_ON;LED_BLUE_OFF;} if(memcmp(buffer,"ledb",strlen("ledb")) == 0){//À¶É«LEDµãÁÁ LED_RED_OFF;LED_GREEN_OFF;LED_BLUE_ON;} buffer[4]=13;//Ìí¼Ó½áÊøλn=strlen(buffer);i2c.write_nbyte(0x03,0x8F,buffer,n); //i2c·¢ËÍÊý¾Ýfor(i=0;i<100;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 [3:0]cnt_rst;always@(posedge CLK_12M)beginif(cnt_rst==4'd10)beginrst_n <= 1'd1;cnt_rst <= 4'd10;endelse cnt_rst <= cnt_rst + 1'd1;end//-------------------------parameter------------------------// parameter ledr = {8'd108,8'd101,8'd100,8'd114,8'd13},ledg = {8'd108,8'd101,8'd100,8'd103,8'd13},ledb = {8'd108,8'd101,8'd100,8'd98, 8'd13},GINGKO = {8'd71,8'd73,8'd78,8'd71,8'd75,8'd79};//---------------------------address------------------------// reg [7:0]device_address,word_address;reg [4:0]m;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindevice_address <= 8'd0;word_address <= 8'd0;m <= 5'd0;tx_en <= 1'd0;rx_en <= 1'd0;endelse begincase(m)5'd0,5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7: //接收8位地址beginif(!rx_en || !tx_en)beginm <= m + 1'd1;device_address <= {device_address[6:0],SDA};endelse m <= 5'd0;end5'd8:beginif(device_address==8'd3 || device_address==8'd2)//识别地址beginm <= 5'd9;device_address <= 8'd0;endelse if(tx_ack || rx_ack)//识别应答应答beginm <= 5'd18;device_address <= 8'd0;endelse beginm <= 5'd0;endend5'd9,5'd10,5'd11,5'd12,5'd13,5'd14,5'd15,5'd16://接收命令beginm <= m + 1'd1;word_address <= {word_address[6:0],SDA};end5'd17:beginif(word_address == 8'h8f)//判断接收命令beginrx_en <= 1'd1;device_address <= 8'hff;word_address <= 8'd0;endelse if(word_address == 8'h0f)//判断发送命令begintx_en <= 1'd1;word_address <= 8'd0;endelse if(tx_ack)begintx_en <= 1'd0;m <= 5'd0;endelse if(rx_ack)beginrx_en <= 1'd0;m <= 5'd0;endelse m <= 5'd17;end5'd18:beginm <= 5'd0;endendcaseend end //-----------------------------rx---------------------------////接收数据reg [63:0]data_in;reg [63:0]data;reg [4:0]i;reg rx_en;reg rx_ack;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindata_in <= 64'd0;data <= 64'd0;i <= 5'd0;rx_ack <= 1'd0;endelse if(rx_en)begincase(i)5'd0,5'd1,5'd2,5'd3,5'd4,5'd5,5'd6,5'd7://接收8位数据begini <= i + 1'd1;rx_ack <= 1'd0;data_in <= {data_in[62:0],SDA};end5'd8:beginif(data_in[7:0]==8'h0d)//判断结束为begini <= 5'd9;rx_ack <= 1'd1;data <= data_in;endelse i <= 5'd0;end5'd9:begini <= 5'd0;rx_ack <= 1'd0;enddefault:begini <= 5'd0;endendcaseendend//----------------------------data--------------------------////对比接收数据reg [2:0]led;always@(posedge CLK_12M or negedge rst_n)beginif(!rst_n)beginled <= 3'b111;endelse begincase(data[39:0])ledr: led <= 3'b011;//红灯亮ledg: led <= 3'b101;//绿灯亮ledb: led <= 3'b110;//蓝灯亮default:led <= 3'b111;//都不亮 endcaseendendassign {FPGA_LEDR,FPGA_LEDG,FPGA_LEDB} = led;//-----------------------------tx---------------------------////发送数据reg [47:0]data_out;reg [3:0]j;reg [2:0]tx_cnt;reg tx_ack;reg tx_en;reg sda;always@(posedge SCL or negedge rst_n)beginif(!rst_n)begindata_out <= GINGKO;j <= 4'd0;tx_ack <= 1'd0;tx_cnt <= 3'd0;sda <= 1'd1;endelse begincase(j)4'd0,4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7://发送8位书籍beginif(tx_en)beginj <= j + 1'd1;{sda,data_out[47:1]} <= data_out;tx_ack <= 1'd0;endend4'd8:begin //发送6次,8位数据(GINGKO)if(tx_cnt ==3'd5)beginj <= j + 1'd1;tx_ack <= 1'd1;tx_cnt <= 3'd0;endelsebeginj <= 4'd0;tx_cnt <= tx_cnt + 1'd1;tx_ack <= 1'd0;endend4'd9:beginj <= 4'd0;tx_ack <= 1'd0;data_out <= GINGKO;enddefault:beginj <= 4'd0;tx_ack <= 1'd0;data_out <= GINGKO;endendcaseendendassign SDA = (j>=4'd1 && j<=4'd8)? sda : 1'dz;//--------------------------endmodule-----------------------// endmodule
实验方法及指导书:
链接:http://pan.baidu.com/s/1hs8ErAW 密码:wven
【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验相关推荐
- 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) {int i,n;char buffer[20];char spi_buffer[20];HAL_Init();system_clock.init ...
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram(input CLK_12M,input WR,input RD,input CS0,inout [15:0]DB,input [2 ...
- 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后 改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT(input C ...
- 【iCore1S 双核心板_ARM】例程五:IWDG看门狗实验——复位ARM
实验原理: STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序错误 时,未在规定时间喂狗,自动复位ARM.本实验通过按键按下,停止喂狗, 制造程序运行 错误,从而产生复位 . 实验现象: ...
- 【iCore1S 双核心板_ARM】例程十六:USB_MSC实验——虚拟U盘
实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_Device,将USB_Device通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验 ...
- 【iCore1S 双核心板_ARM】例程十二:DMA实验——存储器到存储器的传输
实验原理: DAM(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DAM2控制器的数据流0,选用通道0进行数据传输.通过LED的颜色来 判断传输是否成功. ...
- 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) {/* USER CODE BEGIN 1 */int i;int address,data;char error_flag = 0;char r ...
- 【iCore4 双核心板_FPGA】例程五:基础逻辑门实验——逻辑门使用
实验现象: 打开tool-->Netlist viewer-->RTL viewer可观察各个逻辑连接 核心代码: //--------------------module_logic_g ...
- 【iCore3 双核心板_FPGA】例程五:Signal Tapll实验——逻辑分析仪
实验指导书及代码包下载: http://pan.baidu.com/s/1bnNRfaB iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
最新文章
- DEDECMS后台上传banner图控制图片轮播
- 偷天换日,逼真的天空置换算法
- 世界最优秀的分布式文件系统架构演进之路
- mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
- 2021城市大脑与智能产业趋势简报第五期
- python读取excel某一列内容-Python读取Excel数据并根据列名取值
- Redis与Memcached的比较
- TPC-H生成Spark测试用的伪数据集(转载)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的网上商城
- python网络爬虫学习笔记(十):数据存储
- 专业的自建邮件服务器,自己搭建邮件服务器有哪些软硬件需求??
- 南阳理工计算机与科学技术,南阳理工学院计算机与信息工程学院
- GIS产品开源大集合
- AutoRunner 功能自动化测试项目实训之crm客户管理系统试用安装包下载(二十)
- vr全景三维产品交互展示设计
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表 - 解无邪
- C语言之strncpy函数
- 关于华为ensp一些报错处理分享及基础命令
- QA之道知多少(一) 初出茅庐
- wo de wen zhang