《匠人手记》推荐网上购书渠道:
EDN网(ednchina)购书入口   >>>
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历

百宝专栏

  • 首页 相册 标签
  • 电脑应用(65)
  • 供需信息(22)
  • 写书近况(82)
  • 匠人文集(115)
  • 硬件技术(171)
  • 匠人公告(86)
  • 与非门专栏(545)
  • 匠人笔记(115)
  • 团队撰写(96)
  • 汽车电子(52)
  • 编程技巧(465)
  • 程序宝典(476)
  • 网络酷文(472)
  • 开发工具(19)
  • 资料宝藏(274)
  • 项目管理(11)
  • 藏经宝阁(42)
  • 趣味设计(5)
  • 社区热贴(2)
  • 比尔盖茨熊专栏(0) 
  • 百宝信息

    载入中...

    百宝流量

    (2006-07-01开始)



    匠人手记

    基于MSP430单片机的虚拟I2C总线软件包VIIC_M1.0
    程序匠人 发表于 2007-2-25 14:13:00  阅读全文 | 回复(0) | 引用通告 | 编辑

    基于MSP430单片机的虚拟I2C总线软件包VIIC_M1.0

    一、VIIC_M1.0软件包的组成
    根据归一化设计的要求,主方式下虚拟I2CC总线由下列10个子程序组成:
    1、时序模拟子程序4个
    I2C_sta,I2C _stop,I2C _mack ,I2C _mnack
    2、操作模拟子程序3个
    I2C_ackn,I2C _wr_byte,I2C _rd_byte
    3、数据读写子程序3个
    I2C_wr_nbyte,I2C _rd_nbyte,I2C_wr_addr

    二、应用对象

    1、MSP430单片机
    MSP430单片机为低功耗的16位单片机,有MSP430X11、MSP430X112、MSP430X1101、MSP430X13X、MSP430X14X、MSP430X31X/32X/33X、MSP430X41X等型号,每种芯片都有丰富的I/O端口。本设计采用芯片为MSP430E325
    (1)虚拟I2C总线所使用的I/O端口
    >数据线(SDA)使用的是通用端口P0中的P0.7,该端口为输入/输出双向口,有输入寄存器(P0IN)、输出寄存器(P0OUT)及方向寄存器(P0DIR)等寄存器,通过字节指令访问。>>时钟线(SCL)使用的是通用定时器/端口TP中的TP.1,该端口为输出口,有定时器/端口控制寄存器(TPCTL)、定时器/端口数据寄存器(TPD)及定时器/端口允许寄存器(TPE)等,通过字节指令访问。
    (2)运行时所使用的时钟频率
    MSP430E325运行时用两个时钟:辅助时钟(ACLK)和主时钟(MCLK)。当采用32768KHz的晶体振荡器,并且系统时钟控制寄存器采用缺省值时,主时钟的频率为1.049MHz。若主时钟的频率不是1.049MHz,请适当调整程序中nop的个数。  

    2、EEPROM器件
    (1)EEPROM器件
    本例使用的EEPROM器件为24LC65(MICROCHIP)。24LC65容量为8KB,其中的字节地址为13位,分两个字节:
    SUBADDR_H为高5位地址 SUBADDR_L为低8位地址;24LC65的封装引脚如图1所示:
    (2)24LC65的数据格式
    A、当前地址写:S,SLA+W,A,DATA1,A,DTA2,A...,DATAn,A,P
    B、当前地址读:S,SLA+R,A,DATA1,A,DTA2,A...,DATAn,/A,P
    C、指定地址写:S,SLA+W,A,subaddr_H,A,subaddr_L,A,DATA1,A,DATA2,A,...,DATAn,A,P
    D、指定地址读:S,SLA+R,A,subaddr_H,A,subaddr_L,A,DATA1,A,DATA2,A,...,DATAn,/A,P
    其中:SLA+W,SLA+R,subaddr_H,subaddr_L为主控器件发出的数据
    S,A,/A,P为主控器件发出的信息
    DATA1,DATA2,...,DATAn为被控器件发给主控器件的数据
    A 为被控器件发给主控器件的信息
    (3)24LC65与MSP430-325的连接如图2所示

    图一
    图二



    三、应用界面

    1、发送N字节数据——从当前地址开始
    ;发送的数据在MTD中

    ;数列格式:S,SLA+W,subaddr_H,A,subaddr_L,A,DATA1,A,DATA2,A...,DATAn,A,P
    ;MOV.b #CODE,SLA;I2C_R_R/W=0;A0=A1=A2=0
    MOV.b #N,Num_byt;发送字节数
    CALL I2C_WR_Nbyte;从当前地址开始写
    2、接收N字节数据——从指定地址开始读
    ;接收的数据在MRD中

    ;数列格式:S,SLA+W,A,subaddr_H,A,subaddr_L,A,
    S,SLA+R,A,DATA1,A,DATA2,A,...,DATAn,/A,P
    MOV.b #CODE+SLAR/W,SLA
    ;SLAR/W=1,A0=A1=A2=0
    MOV.b #N,Num_byt ;接收字节数
    CALL #I2C_RD_Nbyte ;从当前地址开始读
    3、接收N字节——从指定地址开始读
    ;接收的数据存放在MRD中

    ;数列格式:S,SLA+W,A,subaddr_H,A,subaddr_L,A,
    ;S,SLA+R,A,DATA1,A,DATA2,A,...,DATAn,/A,P

    MOV.b #CODE,SLA
    ;SLAR/W=0:写,A0=A1=A2=0
    MOV.b #N,Num_byt ;接收字节数
    MOV #Subaddr,I2C_R_Addr ;字节地址送入暂存单元
    CALL #I2C_R_Addr ;发送字节地址
    MOV.b #CODE+SLAR/W,SLA;SLAR/W=1:读,A0=A1=A2=0
    CALL #I2C_RD_Nbyte
    4、发送N字节——从指定地址开始写

    ;数列格式:S,SLA+W,A,Subaddr_H,A,subaddr_L,A,DATA1,A,DATA2,A,...,DATAn,A,P

    MOV.b #CODE,SLA;SLAR/W=0:写,A0=A1=A2=0
    MOV #N,Num_byt ;发送字节数
    MOV #Subaddr,I2C_R_Addr ;字节地址送入暂存单元
    CALL #I2C_WR_Addr ;发送字节地址
    CALL #WR_Nbyte

    后记:

    1、如果使用MSP430中别的I/O端口,只需要在模拟时序子程序中改动相应的积存器即可。本例中时钟线使用TP口,是因为它为输出口,在程序中可以节省指令。
    对于24系列的其他芯片,由于容量不同,请特别注意其字节地址是1个字节还是2个字节。本例的24LC65字节地址就是2个字节的。
    2、MSP430系列的单片机本人是初学使用,程序虽经初步调试通过,轻易抛出,主意在为引玉之砖,作为学习的一点体会。缺点和错误在所难免,望各位不吝指教。

     

    VIIC_M1.0软件包

    ⑴ MSP430各寄存器的定义:

    ;*************************************
    ;定义TP0.0--TP0.5各端口的各种控制寄存器
    ;*************************************
    ;
    TPD        .set      004EH   ;TP端口数据寄存器
    TPE        .set      004FH   ;TP端口输出允许寄存器

    TP.0            .set      01H
    TP.1           .set      02H
    TP.2            .set      04H
    TP.3            .set      08H
    TP.4            .set      10H
    TP.5            .set      20H
     
    ;*************************************************
    ;定义P0.0--P0.7各端口的各种控制寄存器
    ;*************************************************
    ;
    P0IN            .set      0010H   ;P0端口输入寄存器
    P0OUT           .set      0011H   ;P0端口输出寄存器
    P0DIR           .set      0012H   ;P0端口方向寄存器

    P0.0           .set      01H
    P0.1           .set      02H
    P0.2           .set      04H
    P0.3           .set      08H
    P0.4           .set      10H
    P0.5           .set      20H
    P0.6           .set      40H
    P0.7           .set      80H
    ;
    CODE   .EQU   0A0H   ;从器件编码
    SLAR/W   .EQU   1H    ;读时为1,写时为0
    A0    .EQU   2H    ;器件地址位
    A1    .EQU   4H    ;器件地址位
    A2    .EQU   8H    ;器件地址位

    VSDA      .set   80H    ;P0.7
    VSCL         .set   02H    ;TP.1

    SLA    .EQU      200h   ;寻址字节存放单元
    Num_byt   .EQU      201h   ;发送数据或接收数据的个数
    I2C_R_Addr  .EQU      202h   ;EEPROM字节地址存放单元
    ;202h为高5位,低8位
    MTD    .EQU      210h   ;发送缓冲区
    MRD    .EQU      220h   ;接收缓冲区

    I2Cdata   .EQU      R7    ;数据暂存单元
    Count   .EQU      R8    ;计数器
    Mask   .EQU   R9       ;屏蔽字

    Subaddr   .EQU   0xxxxh   ;EEPROM字节地址
                ;Subaddr_H:高5位,Subaddr_L:低8位
    N    .EQU   0yyh   ;发送或接收的字节数
    ;
     ⑵ 子程序集

     ① 时序模拟子程序

    ;ⅰ.开始条件:启动总线
    ;
    I2C_Sta   bis.b       #VSDA,&P0DIR        ;设置VSDA为输出
            bis.b      #VSDA,&P0OUT        ;VSDA输出为高
            bis.b  #VSCL,&TPE          ;VSCL输出允许
            bis.b  #VSCL,&TPD          ;VSCL输出为高
            nop
            nop
            bic.b    #VSDA,&P0OUT        ;VSDA输出为低
           nop
            nop
                bic.b    #VSCL,&TPD   ;VSCL输出为低
           ret
    ;
    ;ⅱ.停止条件:停止数据传送
    ;
    I2C_Stop     bis.b      #VSDA,&P0DIR        ;设置VSDA为输出
            bic.b     #VSDA,&P0OUT        ;VSDA输出为低
               bis.b     #VSCL,&TPD   ;VSCL输出为高
            nop
            nop
            bis.b     #VSDA,&P0OUT     ;VSDA输出为高
            nop
            nop
            bic.b      #VSCL,&TPD     ;VSCL输出为低
            bic.b  #VSCL,&TPD          ;VSCL输出禁止
            ret
    ;
    ;ⅲ.发送应答位
    ;
    I2C_Mack  bis.b    #VSDA,&P0DIR       ;设置VSDA为输出
            bic.b     #VSDA,&P0OUT       ;VSDA输出为低
            bis.b     #VSCL,&TPD   ;VSCL输出为高
            nop
            nop
            bic.b     #VSDA,&P0OUT       ;VSDA输出为低
           bic.b    #VSCL,&TPD       ;VSCL输出为低
           bis.b    #VSDA,&P0OUT  ;VSDA输出为高
           ret
    ;
    ;ⅳ.发送非应答位
    ;
    I2C_MNack  bis.b     #VSDA,&P0DIR     ;设置VSDA为输出
           bis.b    #VSDA,&P0OUT  ;VSDA输出为高
            bis.b      #VSCL,&TPD       ;VSCL输出为高
           nop
           nop
           bic.b     #VSCL,&TPD   ;VSCL输出为低
           bic.b      #VSDA,&P0OUT     ;VSDA输出为低
           ret

     ② 操作模拟子程序
    ;
    ; ⅰ.检查应答位
    ; 应答位在进位位(Carry)中
    ;
    I2C_Ackn  bis.b      #VSCL,&TPD       ;VSCL输出为高,使VSDA上数据有效
        nop
        nop
             bic.b      #VSDA,&P0DIR     ;设置VSDA为输入
        bit.b      #VSDA,&P0IN   ;读数据进近位位(Carry)
                ;(Acknowledge bit)
        nop
        nop
           bic.b     #VSCL,&TPD   ;VSCL输出为低
        nop
            ret

    ; ⅱ. 发送数据字节
    ;
    ;发送的数据在I2CData中
    ;占用Mask,I2CData
    ;
    I2C_WR_BYT  mov.b  #80H,Mask   ;位屏蔽:MSB 在先
    I2C_WR_BYT1  bit.b       Mask,I2CData  ;信息位进进位位(Carry)
             jc        I2C_WR_BYT2
        bis.b    #VSDA,&P0DIR    ;信息位是0
             bic.b      #VSDA,&P0OUT     ;VSDA输出为低
             bis.b      #VSCL,&TPD        ;VSCL输出为高
           nop
           nop
             bic.b     #VSCL,&TPD   ;VSCL输出为低
             jmp       I2C_WR_BYT3
    ;
    I2C_WR_BYT2  bis.b     #VSDA,&P0DIR   ;信息位是 1
            bis.b      #VSDA,&P0OUT  ;VSDA输出为高
             bis.b      #VSCL,&TPD        ;VSCL输出为高
          nop
           nop
            bic.b    #VSCL,&TPD   ;VSCL输出为低
             bic.b      #VSDA,&P0OUT  ;VSDA输出为低
    ;   
    I2C_WR_BYT3  clrc
            rrc.b    Mask    ;指向下一位
            jnc      I2C_WR_BYT1   ;进位位为0,继续
          nop
           nop
            ret
    ;
    ;ⅲ. 接收数据字节
    ;
    ;接收的数据在I2CData中
    ;占用I2CData,Count
    ;
    I2C_RD_BYT  clr          I2CData
             mov.b  #8,Count      ;设置接收数据字节的移位次数
    ;
    I2C_RD_BYT1  bic.b      #VSDA,&P0DIR     ;设置VSDA为输入
        bis.b        #VSCL,&TPD        ;VSCL输出为高,使VSDA上数据有效
             nop
             bit.b        #VSDA,&P0IN       ;读入的位在C中,是"1"或是"0"?
             rlc.b        I2CData         ;从进位位开始左移
             nop
             nop
             bic.b        #VSCL,&TPD         ;设置VSCL输出为低,可继续接收数据位
             nop
             nop
             dec         Count
             jnz         I2C_RD_BYT1    ;8位数据没有移完,则继续移位
        ret

     ③ 数据读写子程序
    ;
    ;ⅰ.发送N字节数据
    ; --从当前地址开始发送
    ;
    ;数据在MTD中
    ;SLA中为SLAW
    ;字节数在Num_byt中
    ;占用R6
    ;调用:I2C_Sta,I2C_WR_BYT,I2C_Ackn,I2C_Stop
    ;数列格式: S,SLA+W,A,DATA1,A,DATA2,A,....,DATAn,A,P
    ;
    I2C_WR_Nbyte
      
    WR_Conrol_byte
        CALL  #I2C_Sta
             mov.b    SLA,I2CData   ;送出SLAW
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   WR_Conrol_byte  ;C=0,继续
    WR_Nbyte
        clr   R6
    WR_Nbyte1
        MOV.B  MTD(R6),I2CData
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   WR_Nbyte
        inc   R6
        cmp.b  Num_byt,R6
        JNZ   WR_Nbyte1
        CALL  #I2C_Stop
        RET
    ;
    ;ⅱ. 接收N字节数据
    ; --从当前地址开始读
    ;
    ;数据存放在MRD中
    ;接收的字节数在Num_byt中
    ;数列格式: S,SLA+R,A,DATA1,A,DATA2,A,....,DATAn,/A,P
    ;
    I2C_RD_Nbyte

    RD_Conrol_byte
        CALL  #I2C_Sta
             mov.b    SLA,I2CData   ;送出SLAR
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   RD_Conrol_byte  ;检查应答位
    RD_Nbyte
        clr   R6
    RD_Nbyte1
        CALL  #I2C_RD_BYT
        MOV.B  I2CData,MRD(R6)
        inc   R6
        cmp.b  Num_byt,R6
        JNZ   RD_Nbyte2
        CALL  #I2C_MNack   ;N字节数据读完,送出非应答位
        CALL  #I2C_Stop   ;送出Stop
        RET
    RD_Nbyte2  CALL  #I2C_Mack   ;送出应答位
        JMP   RD_Nbyte1
    ;
    ;ⅲ. 向EEPROM发送数据单元地址
    ;
    ;EEPROM中字节地址在I2C_R_Addr(高),I2C_R_Addr+1(低)中
    ;数列格式:S,SLA+W,A,Subaddr_H,A,Subaddr_L,A
    ;
    I2C_WR_Addr
    WR_Addr   CALL  #I2C_Sta
             mov.b     SLA,I2CData   ;送出SLAW
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   WR_Addr
        MOV.b  I2C_R_Addr,I2CData ;送出字节地址的高5位
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   WR_Addr
        MOV.b  I2C_R_Addr+1,I2Cdata ;送出字节地址的低8位
        CALL  #I2C_WR_BYT
        CALL  #I2C_Ackn
        JC   WR_Addr
        RET

     


    (北京工业大学 张俊谟)

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

  • 标签:MSP430 I2C 
  • 发表评论:
    载入中...

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    广告5号位 [投放]


    学习板、开发板、编程器、下载器、仿真器(查看详情……)

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     
     

    新鲜货色

    匠人手记

    近期动态

    载入中...

      《匠人手记》购书全攻略 
     书友近况:淘书手记答疑与讨论:什么是散转程序 
     《匠人手记》新书艳照
     EDN《匠人手记》签名售书优惠活动开始报名啦!
     欢迎加入《匠人手记》EDN书友会
     欢迎加入《匠人手记》书友会Q群
     《匠人手记》终稿目录
     《匠人手记》封面,请大家先睹为快
     上周六收到了北航寄来的《匠人手记》清样,让大家先睹为快

    匠人原创

    粉丝评论

    往日酷贴

    载入中...

    载入中...



     网络酷文:博客,改变的不仅仅是图书 
     网络酷文:C语言宏定义技巧C语言 条件编译详解

      21IC上海2008-04聚会报名进行中。。。 
     两分钟让你明白什么是ERP![转]
      神奇的Duff's Device 算法
      实用一线通讯电路及软件设计方法
      程序员的“七年之痒”
      史上最短但最精彩的武侠小说
      网络无厘头文学《缺钙水浒》(爆笑)

     你的博客还能持续多久(转贴)
     电动车无刷电机控制器软件设计要点(作者:谢渊斌)

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!