打印

msp430的i2c程序

[复制链接]
2198|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
konglingfei0615|  楼主 | 2013-5-22 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "MSP430x14x.h"
#define WPL     P1OUT &= ~BIT2
#define WPH     P1OUT |= BIT2
#define SCLL    P1OUT &= ~BIT3
#define SCLH    P1OUT |= BIT3
#define SDAL    P1OUT &= ~BIT4
#define SDAH    P1OUT |= BIT4
#define SDA_OUT P1DIR |= BIT4
#define SDA_IN  P1DIR &= ~BIT4
#define WR_BIT          0x00
#define RD_BIT          0x01
#define FRAMADDR        0xa0
/*延时函数*/
void Delayus(ulong num)
{
  ulong i;

  for (i = 0; i < num; i++);
}

/****************************************************************************
**  函数名称:I2CStart
**  功能描述:总线启动信号
**  入口参数:无
**  出口参数:无
****************************************************************************/
void I2CStart(void)
{
    SDA_OUT;
   
    SCLL;
    Delayus(1);
    SDAH;
    Delayus(1);
    SCLH;
    Delayus(1);
    SDAL;
    Delayus(1);
}

/****************************************************************************
**  函数名称:I2CStop
**  功能描述:总线停止信号
**  入口参数:无
**  出口参数:无
****************************************************************************/
void I2CStop(void)
{
    SDA_OUT;
   
    SCLL;
    Delayus(1);
    SDAL;
    Delayus(1);
    SCLH;
    Delayus(1);
    SDAH;
    Delayus(1);
}

/****************************************************************************
**  函数名称:Ack
**  功能描述:返回应答信号
**  入口参数:无
**  出口参数:无
****************************************************************************/
void Ack(void)
{
    SDA_OUT;
   
    SCLL;
    Delayus(1);
    SDAL;
    SCLH;
    Delayus(1);
    SCLL;
    Delayus(1);
    SDAH;
}

/****************************************************************************
**  函数名称:NoAck
**  功能描述:返回非应答信号
**  入口参数:无
**  出口参数:无
****************************************************************************/
void NoAck(void)
{
    SDA_OUT;
   
    SCLL;
    Delayus(1);
    SDAH;
    Delayus(1);
    SCLH;
    Delayus(1);
    SCLL;
    Delayus(1);
}

/****************************************************************************
**  函数名称:WriteByte
**  功能描述:写一个字节数据
**  入口参数:Data = 一个字节数据
**  出口参数:无
****************************************************************************/
void WriteByte(uchar Data)
{
    uchar i;
   
    SDA_OUT;
   
    for (i = 0; i < 8; i++)
    {       
        SCLL;
        if(Data & 0x80)
        {
            SDAH;
        }
        else
        {
            SDAL;
        }
        Data <<= 1;
        SCLH;
    }
    SCLL;
    Delayus(1);
    SCLH;
    Delayus(1);
    SCLL;
    SDAH;
    Delayus(1);
}

/****************************************************************************
**  函数名称:ReadByte
**  功能描述:读一个字节数据
**  入口参数:无
**  出口参数:一个字节数据
****************************************************************************/
uchar ReadByte(void)
{
    uchar i;
    uchar DateTemp;
      
    SDA_IN;
   
    for (i = 0; i < 8; i++)
    {
        SCLL;
        Delayus(1);
        
        DateTemp <<= 1;
        if( P1IN & BIT4 )   //SDA的引脚
        {
            DateTemp |= 0x01;
        }
        
        SCLH;
        Delayus(1);
    }
   
    return DateTemp;
}

/****************************************************************************
**  函数名称:FRAMWrite
**  功能描述:写存储器操作
**  入口参数:*Data=读出数据,Addr=读地址,Length=读长度
**  出口参数:无
****************************************************************************/
void FRAMWrite ( uchar *Data, uchar Addr,uchar Length)
{
    uchar i;
    uchar AddrTemp;
   
    WPL;                     //允许24LC02写
   
    AddrTemp = Addr;
    I2CStart();
    WriteByte(FRAMADDR + WR_BIT);
    WriteByte(AddrTemp);
   
    for(i = 0; i < Length; i++)
    {
        WriteByte(*Data++);                 
        AddrTemp++;
        if(AddrTemp % 8 == 0)                           //每页8字节        换页
        {
            I2CStop();
            Delayus(5);
            I2CStart();
            WriteByte(FRAMADDR+WR_BIT);
            WriteByte(AddrTemp);
        }
    }
    I2CStop();                                        //发停止信号
   
    WPH;
}

/****************************************************************************
**  函数名称:FRAMRead
**  功能描述:读存储器操作
**  入口参数:Addr=读地址,Length=读长度
**  出口参数:*Data=读出数据
****************************************************************************/
void FRAMRead (uchar *Data, uchar Addr, uchar Length)
{
    uchar i;

    WPL;                         //允许24LC02写
   
    I2CStart();                       
    WriteByte(FRAMADDR+WR_BIT);       
    WriteByte(Addr);
   
    I2CStart();
    WriteByte(FRAMADDR+RD_BIT);
   
    for(i = 0; i < (Length - 1); i++)
    {
        *Data=ReadByte();
        Data++;
        Ack();
    }
   
    *Data=ReadByte();
    NoAck();
    I2CStop();
   
    WPH;
}

相关帖子

沙发
zwp0822| | 2013-5-22 17:29 | 只看该作者
自己写的么?
支持一下!!!

使用特权

评论回复
板凳
angerbird| | 2013-5-22 22:38 | 只看该作者
看来楼主没有用单片机自身自带的IIC模块的

使用特权

评论回复
地板
angerbird| | 2013-5-22 22:39 | 只看该作者
其实一般做开发设计的时候都是习惯用IO口模拟的IIC总线的

使用特权

评论回复
5
konglingfei0615|  楼主 | 2013-5-23 10:01 | 只看该作者
angerbird 发表于 2013-5-22 22:38
看来楼主没有用单片机自身自带的IIC模块的

我是刚学430,闲来就把之前用51写的iic程序改了一下

使用特权

评论回复
6
weihaitun| | 2013-5-23 21:01 | 只看该作者
后来知道必须将SDA设为输入模式,用改变IO方向来输出高低电平,感觉不可思议。

使用特权

评论回复
7
waitingf| | 2013-5-24 14:24 | 只看该作者
可以直接用吗

使用特权

评论回复
8
konglingfei0615|  楼主 | 2013-5-24 14:55 | 只看该作者
waitingf 发表于 2013-5-24 14:24
可以直接用吗

可以的,

使用特权

评论回复
9
someonewho| | 2013-5-24 14:57 | 只看该作者
真的很不错 多谢了

使用特权

评论回复
10
justbybing| | 2013-5-24 15:39 | 只看该作者
支持支持

使用特权

评论回复
11
specialfrin| | 2013-5-24 16:09 | 只看该作者
真的很好用

使用特权

评论回复
12
someontime| | 2013-5-24 16:32 | 只看该作者
楼主大好人 多谢了

使用特权

评论回复
13
Linda_008| | 2013-5-24 17:28 | 只看该作者
楼主,用430自带的IIC模块编一个

使用特权

评论回复
14
awficel1| | 2013-5-25 15:26 | 只看该作者
用模块编写代码要简单一些吧.

使用特权

评论回复
15
xichengmadia| | 2013-5-25 20:40 | 只看该作者
真的很好,多谢楼主

使用特权

评论回复
16
beiwaroad| | 2013-5-25 21:38 | 只看该作者
测试了一下,可以直接使用

使用特权

评论回复
17
taihezhibanh| | 2013-5-25 21:49 | 只看该作者
收了,楼主真是好人

使用特权

评论回复
18
Linda_008| | 2013-5-27 17:32 | 只看该作者
自带的IIC模块例程还没发现

使用特权

评论回复
19
xiongji712| | 2013-6-21 00:46 | 只看该作者
好吧,,正在学、、、、

使用特权

评论回复
20
qin552011373| | 2013-6-30 23:44 | 只看该作者
模拟的好用  如果不要求速度

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

136

帖子

0

粉丝