3053|3

62

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

实在是没办法了请高手帮帮忙啊 [复制链接]

最近在弄430I2C协议,不知道那里出问题了总是调不出来,我已经调试了两天了,今天测试程序连往芯片里写都没法写根本检测不到应答信号。使用的是MSP430F1611,晶振使用的4M晶振。希望有高手能帮我看看程序。

程序.zip

4.78 KB, 下载次数: 4

430程序

最新回复

以前写过,拿出来参考下 void I2C_init(void) {     SET(PT(I2C_SCL_PORT,DIR,I2C_SCL_BIT));     CLR(PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT)); } void I2C_wait(void) {     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP"); } void I2C_ack(void) {     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));        PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; } void I2C_noack(void) {     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; } unsigned char I2C_start(void) //在scl高电平过程中,sda产生一个下降沿 {     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT));     I2C_wait();         SET(PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT));     I2C_wait();         CLR(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     if(PT(I2C_SDA_PORT,IN,I2C_SDA_BIT) == 0)// SDA 为低,则说明有其他设备使用sda       return 0;         SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0; //产生一个下降沿     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;         return 1; } void I2C_stop(void) {     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; // rasing edge     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) =1; } unsigned char I2C_waitack(void) {     unsigned int x = 0xffff;     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT));     I2C_wait();     CLR(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;             while(PT(I2C_SDA_PORT,IN,I2C_SDA_BIT) == 1)     {         x--;         if(!x)         {             PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;             return 0;         }     }         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));     return 1; } void I2C_send_bit(unsigned char value) {     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));         if(value != 0)         PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;     else         PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;     I2C_wait();         PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;     I2C_wait();     PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; //拉高sda,不影响其他设备使用sda } void I2C_send_byte(unsigned char value,unsigned char order) {     unsigned char i;     SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));         if(order == 1) //先发送高位,在发送低位     {         for(i=0; i  详情 回复 发表于 2012-10-14 19:27
 
点赞 关注

回复
举报

755

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
可以用示波器看看430输出的波形是否满足24C02的访问时序
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
用示波器没看出波形来,可能是不大会用吧,我这里调试也挺麻烦的,几个人共用一个仿真器,示波器这边还没有,还得去别的地方用。
 
 
 

回复

44

帖子

0

TA的资源

一粒金砂(高级)

4
 
以前写过,拿出来参考下

void I2C_init(void)
{
    SET(PT(I2C_SCL_PORT,DIR,I2C_SCL_BIT));
    CLR(PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT));
}

void I2C_wait(void)
{
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
}


void I2C_ack(void)
{
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));   
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;
}

void I2C_noack(void)
{
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;
}

unsigned char I2C_start(void) //在scl高电平过程中,sda产生一个下降沿
{
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT));
    I2C_wait();
   
    SET(PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT));
    I2C_wait();
   
    CLR(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    if(PT(I2C_SDA_PORT,IN,I2C_SDA_BIT) == 0)// SDA 为低,则说明有其他设备使用sda
      return 0;
   
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0; //产生一个下降沿
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;
   
    return 1;
}

void I2C_stop(void)
{
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; // rasing edge
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) =1;
}

unsigned char I2C_waitack(void)
{
    unsigned int x = 0xffff;
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT));
    I2C_wait();
    CLR(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
   
   
    while(PT(I2C_SDA_PORT,IN,I2C_SDA_BIT) == 1)
    {
        x--;
        if(!x)
        {
            PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
            return 0;
        }
    }
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    return 1;
}

void I2C_send_bit(unsigned char value)
{
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
   
    if(value != 0)
        PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1;
    else
        PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 0;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
    I2C_wait();
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
    PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT) = 1; //拉高sda,不影响其他设备使用sda
}


void I2C_send_byte(unsigned char value,unsigned char order)
{
    unsigned char i;
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
   
    if(order == 1) //先发送高位,在发送低位
    {
        for(i=0; i<8; i++)
        {
            I2C_send_bit(value & 0x80);
            value <<= 1;
        }  
    }
    else//先发送低位,再发送高位
    {
        for(i=0; i<8; i++)
        {
            I2C_send_bit(value & 0x01);
            value >>= 1;
        }
    }
}

unsigned char I2C_receive_bit(void)
{
    unsigned char c;  
   
  
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 1;
    I2C_wait();
   
    if(PT(I2C_SDA_PORT,IN,I2C_SDA_BIT) == 1)
        c = 1;
    else
        c = 0;
   
    PT(I2C_SCL_PORT,OUT,I2C_SCL_BIT) = 0;
    I2C_wait();
   
    return c;   
}

unsigned char  I2C_receive_byte(unsigned char order)
{
    unsigned char i, value = 0;
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT)); //将sda拉高,防止影响
    CLR(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
   
    if(order == 1) //数据从高位开始接收
    {
        for(i = 0; i < 8; i++)
        {
            value <<= 1;
            if(I2C_receive_bit() == 1)
                value |= 0x01;      
        }
    }
    else//数据从低位开始接收
    {
        for(i = 0;i < 8; i++)
        {
            value >>= 1;
            if(I2C_receive_bit() == 1)
                value |= 0x80;            
        }
        
    }
   
    SET(PT(I2C_SDA_PORT,DIR,I2C_SDA_BIT));
    SET(PT(I2C_SDA_PORT,OUT,I2C_SDA_BIT));
    return value;
}


set就是 置1, clr 就是置0: 希望对你有帮助
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表