找回密码
 注册
关于网站域名变更的通知
查看: 677|回复: 3
打印 上一主题 下一主题

linux学习之路_or1200下linux的i2c(一)

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-8-5 10:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 mutougeda 于 2021-8-5 10:14 编辑 % L! n4 k3 A' [2 y1 A* y

    ; J8 ~: B( P* \: ^, B这篇 blog 介绍 I2C 的学习了,首先要在我们的 or1200_soc 上添加进来 I2C Controller ,到 opencores 社区上面找到 i2c_latest.tar.gz 这个工程包。2 B3 I) x- x- `7 e1 d
            解压得到如下文件目录:5 S/ P; M9 a, _' V5 D

    + C# o8 R( @) b4 s# x2 ? 1 W9 |) K) N, E/ f* |: \5 q! Z
    - D% K9 v. L, Z+ A; o4 R
    4 U, H2 Z1 ~$ e* R% b& p
            注意啦,这里的i2c_top.v的顶层文件需要自己编写,因为需要在工程的更顶层将i2c_master_top.v里的输入输出信号组织成三态信号。
    & D8 y$ N4 P% `3 `6 z0 U7 {  `  B5 V+ G2 Y

    6 u& R7 z* _- Z7 Z' I  u
    • module i2c_top(
    •     //wishbone inteRFaces
    •     wb_clk_i, wb_rst_i, arst_i,
    •     wb_adr_i, wb_dat_i, wb_dat_o,
    •     wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_inta_o,
    •     i2c_scl, i2c_sda
    •     );
    •     // wishbone signals
    •     input        wb_clk_i;     // master clock input
    •     input        wb_rst_i;     // synchronous active high reset
    •     input        arst_i;       // asynchronous reset
    •     input  [2:0] wb_adr_i;     // lower address bits
    •     input  [7:0] wb_dat_i;     // databus input
    •     output [7:0] wb_dat_o;     // databus output
    •     input        wb_we_i;      // write enable input
    •     input        wb_stb_i;     // stobe/core select signal
    •     input        wb_cyc_i;     // valid bus cycle input
    •     output       wb_ack_o;     // bus cycle acknowledge output
    •     output       wb_inta_o;    // interrupt request signal output
    •     // i2c signals
    •     inout   i2c_scl;    //i2c clock signal
    •     inout   i2c_sda;    //i2c data signal
    • i2c_master_top  i2c_master_top(
    •     //wishbone interfaces
    •     .wb_clk_i(wb_clk_i),
    •     .wb_rst_i(wb_rst_i),
    •     .arst_i(arst_i),
    •     .wb_adr_i(wb_adr_i),
    •     .wb_dat_i(wb_dat_i),
    •     .wb_dat_o(wb_dat_o),
    •     .wb_we_i(wb_we_i),
    •     .wb_stb_i(wb_stb_i),
    •     .wb_cyc_i(wb_cyc_i),
    •     .wb_ack_o(wb_ack_o),
    •     .wb_inta_o(wb_inta_o),
    •     .scl_pad_i(scl_pad_i),
    •     .scl_pad_o(scl_pad_o),
    •     .scl_padoen_o(scl_padoen_o),
    •     .sda_pad_i(sda_pad_i),
    •     .sda_pad_o(sda_pad_o),
    •     .sda_padoen_o(sda_padoen_o)
    •      );
    • assign i2c_scl = scl_padoen_o ? 1'bz : scl_pad_o;
    • assign i2c_sda = sda_padoen_o ? 1'bz : sda_pad_o;
    • assign scl_pad_i = i2c_scl;
    • assign sda_pad_i = i2c_sda;
    • endmodule  K* B  [8 d4 e. U1 F6 {; v
    * o4 D* y$ Q! A% m- x
    , J7 h! c0 x7 y" h4 W
            详细可以看看在改工程目录下的/doc说明文档,当中有改ipcore的使用说明。
    + D" B4 ]! v+ g8 Z% \' s9 g' a5 y( Q% n8 h
            接着在or1200_soc中例化改ipcore,然后添加到wishbone总线上,再定义好使用的中断号。
    6 {$ m9 {6 n4 t! q3 s* w
    ) [  G3 U; v3 r. c! s        例化代码:
    + S8 c  W% s! d7 b
    8 e" A- U. ^0 @6 m; _
    • `ifdef I2C
    • wire [2:0] wb_i2c_adr_i;
    • wire [7:0] wb_i2c_dat_i;
    • wire [7:0] wb_i2c_dat_o;
    • wire [31:0] wb_i2c_dat32_i;
    • wire [31:0] wb_i2c_dat32_o;
    • wire [3:0]  wb_i2c_sel_i;
    • wire wb_i2c_stb_i;
    • wire wb_i2c_we_i;
    • wire wb_i2c_ack_o;
    • wire wb_i2c_cyc_i;
    • wire wb_i2c_inta_o;
    • i2c_master_top i2c_master_top(
    •     //wishbone interfaces
    •     .wb_clk_i(clk_cpu_40),
    •     .wb_rst_i(wb_rst_pad_i),
    •     .arst_i(1'b1),
    •     .wb_adr_i(wb_i2c_adr_i),
    •     .wb_dat_i(wb_i2c_dat_i),
    •     .wb_dat_o(wb_i2c_dat_o),
    •     .wb_we_i(wb_i2c_we_i),
    •     .wb_stb_i(wb_i2c_stb_i),
    •     .wb_cyc_i(wb_i2c_cyc_i),
    •     .wb_ack_o(wb_i2c_ack_o),
    •     .wb_inta_o(pic_ints[`APP_INT_I2C]),
    •     //i2c interface
    •     .scl_pad_i(scl_pad_i),
    •     .scl_pad_o(scl_pad_o),
    •     .scl_padoen_o(scl_padoen_o),
    •     .sda_pad_i(sda_pad_i),
    •     .sda_pad_o(sda_pad_o),
    •     .sda_padoen_o(sda_padoen_o)
    •     );
    • assign i2c_scl = scl_padoen_o ? 1'bz : scl_pad_o;
    • assign i2c_sda = sda_padoen_o ? 1'bz : sda_pad_o;
    • assign scl_pad_i = i2c_scl;
    • assign sda_pad_i = i2c_sda;
    • assign wb_i2c_dat32_o[7:0]   = (wb_i2c_sel_i[0] == 1'b1) ? wb_i2c_dat_o : 8'h0;
    • assign wb_i2c_dat32_o[15:8]  = (wb_i2c_sel_i[1] == 1'b1) ? wb_i2c_dat_o : 8'h0;
    • assign wb_i2c_dat32_o[23:16] = (wb_i2c_sel_i[2] == 1'b1) ? wb_i2c_dat_o : 8'h0;
    • assign wb_i2c_dat32_o[31:24] = (wb_i2c_sel_i[3] == 1'b1) ? wb_i2c_dat_o : 8'h0;
    • assign wb_i2c_dat_i = wb_i2c_dat32_i[7:0];
    • `else
    • assign pic_ints[`APP_INT_I2C] = 'b0;
    • `endif/*endif I2C*/
    • /* the comment section below just instance for wb_conbus module */
    • /*
    • `ifdef I2C
    •     .s5_dat_i   (wb_i2c_dat32_o),
    •     .s5_dat_o   (wb_i2c_dat32_i),
    •     .s5_adr_o   (wb_i2c_adr_i),
    •     .s5_sel_o   (wb_i2c_sel_i),
    •     .s5_we_o    (wb_i2c_we_i),
    •     .s5_cyc_o   (wb_i2c_cyc_i),
    •     .s5_stb_o   (wb_i2c_stb_i),
    •     .s5_ack_i   (wb_i2c_ack_o),
    •     .s5_err_i   (1'b0),
    •     .s5_rty_i   (1'b0),
    • //  .s5_cab_i   (),
    • for switch cross bus :
    •     // .slave5_sel_addr ( `I2C_BASE_ADDR ),
    •     .wbs5_adr_i( wb_i2c_adr_i ),
    •     .wbs5_bte_i(  ),
    •     .wbs5_cti_i(  ),
    •     .wbs5_cyc_i( wb_i2c_cyc_i ),
    •     .wbs5_dat_i( wb_i2c_dat32_i ),
    •     .wbs5_sel_i( wb_i2c_sel_i ),
    •     .wbs5_stb_i( wb_i2c_stb_i ),
    •     .wbs5_we_i( wb_i2c_we_i ),
    •     .wbs5_ack_o( wb_i2c_ack_o ),
    •     .wbs5_err_o( 'b0 ),
    •     .wbs5_rty_o( 'b0 ),
    •     .wbs5_dat_o( wb_i2c_dat32_o ),
    • */
      1 D* C% A8 Y: B) S% T7 V( ]

    3 |" R) {# X. v# `4 J) S3 R
    * A, p: o& B$ G6 n( a9 |        中断号和地址:* O0 d* q6 ~& I; m/ D$ r: t6 f  r0 \
    ; A. Z( I' Y8 |( O" J! w
    • /* Interrupts */
    • `define APP_INT_RES1        1:0
    • `define APP_INT_UART        2
    • `define APP_INT_KEY     3
    • `define APP_INT_ETH     4
    • `define APP_INT_I2C         5
    • `define APP_INT_VGA_LCD 6
    • `define APP_INT_RES     19:7
    • /* Peripheral Addr ,modify by manual */
    • `define FLASH_BASE_ADDR 4'hf        //slave X address ,connect to FLASH
    • `define SDRAM_BASE_ADDR 4'h0        //slave X address ,connect to DDR_SDRAM
    • `define UART_BASE_ADDR  8'h90   //slave X address ,connect to UART
    • `define GPIO_BASE_ADDR  8'h91   //slave X address
    • `define ETH_BASE_ADDR       8'h92   //slave X address ,connect to ETH
    • `define VGA_BASE_ADDR       8'h95   //slave X address, connect to VGA/LCD
    • `define DMA_BASE_ADDR   8'hxx   //slave X address,
    • `define SRAM_BASE_ADDR  8'hxx   //slave X address ,connect to SRAM
    • `define SD_CARD_BASE_ADDR   8'h94   //slave X address ,connect to sd_card
    • `define I2C_BASE_ADDR       8'h93   //slave X address ,connect to i2c device2 y8 G- Z! O' T2 |; j

    ( o: P2 S5 f( M# J5 b
    ( O5 e3 k( i+ K% h8 A6 L  F" h$ ?* K1 P$ J% u
            添加到wishbone总线:
    $ S& {0 L9 y( E9 C6 @% Q% L" G5 @/ f$ n% d: u; o) T
    3 e9 T( d+ |" q7 x8 u
    • wb_switch_b3 #(
    •     .slave0_sel_addr ( `FLASH_BASE_ADDR ),
    •     .slave1_sel_addr ( `SDRAM_BASE_ADDR ),
    •     .slave2_sel_addr ( `UART_BASE_ADDR ),
    •     .slave3_sel_addr ( `ETH_BASE_ADDR ),
    •     .slave4_sel_addr ( `GPIO_BASE_ADDR ),
    •     .slave5_sel_addr ( `I2C_BASE_ADDR ),
    •     .slave6_sel_addr ( 'hfffffffe ),
    •     .slave7_sel_addr ( 'hfffffffe )
    •     )
    •     wb_switch_b3(
    •     // Clocks, resets
    •     .wb_clk(clk_cpu_40),
    •     .wb_rst(wb_rst_pad_i),
    •         ........
    •     // Slave 5 Interface ,connect to simple_i2c
    •     .wbs5_adr_i( wb_i2c_adr_i ),
    •     .wbs5_bte_i(  ),
    •     .wbs5_cti_i(  ),
    •     .wbs5_cyc_i( wb_i2c_cyc_i ),
    •     .wbs5_dat_i( wb_i2c_dat32_i ),
    •     .wbs5_sel_i( wb_i2c_sel_i ),
    •     .wbs5_stb_i( wb_i2c_stb_i ),
    •     .wbs5_we_i( wb_i2c_we_i ),
    •     .wbs5_ack_o( wb_i2c_ack_o ),
    •     .wbs5_err_o( 'b0 ),
    •     .wbs5_rty_o( 'b0 ),
    •     .wbs5_dat_o( wb_i2c_dat32_o ),
    •         ........
    • );6 O4 c( m1 r& h) }9 g

      e, ?8 y6 O3 _1 c3 y% r
    8 Y: f: b; n% ~% W4 N3 N  L1 |8 v+ ]$ M" i1 n- m! t; M. o" g
            OK,synthesize之,注意稍微看看时序够不够即可。; x5 D0 P; A: J  u8 S

    ) m. L/ b" ^1 N6 A7 g
    $ N; Y" Q2 @, e2 a! n( e) P; l

    该用户从未签到

    2#
    发表于 2021-8-5 14:16 | 只看该作者
    or1200下linux的i2c
  • TA的每日心情
    慵懒
    2020-6-13 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-8-5 18:52 | 只看该作者
    or1200下linux的i2c

    该用户从未签到

    4#
    发表于 2021-8-5 18:53 | 只看该作者
    or1200下linux的i2c
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 09:03 , Processed in 0.156250 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表