3537|2

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谁会用msp430调pcf8574啊?跪求 [复制链接]

谁会用msp430调pcf8574啊?跪求
我自己写了一个,可惜不知什么原因,就是8574死活没有反应,无语了

最新回复

我的源程序如下 #include "msp430x22x4.h" unsigned int RxByteCtr; /********************************************************* *        数据定义 *********************************************************/ unsigned char read_Buf,         //读缓冲区               write_Buf, //写缓冲区               ctrl_Buf,  //用于存放控制指令等的中间缓冲区               addr_Buf1,  //高地址缓冲               addr_Buf2,               ack_Flag;  //应答标识 /************************************************ *        延迟 ************************************************/ void iic_Delay(void) {    _NOP();    _NOP();    _NOP();    } /********************************************************* *        启动IIC *********************************************************/ void start_IIC(void) {      //P3DIR &= 11111001;//P4OUT &= 0x3f;        //设置P4OUT      P3DIR |= BIT1+BIT2;//P4DIR &= 0x7f;        //SDA = 1      P3OUT |=BIT1;           iic_Delay();      iic_Delay();      //P3DIR |= BIT2;      P3OUT |=BIT2;//P4DIR &= 0xbf;        //SCL = 1      iic_Delay();iic_Delay();      P3OUT &= ~BIT1;//P4DIR |= 0x80;        //SDA = 0      iic_Delay();iic_Delay();      P3OUT &= ~BIT2;//P4DIR |= 0x40;        //SCL = 0      iic_Delay();iic_Delay(); } /******************************************************* *        停止IIC *******************************************************/ void stop_IIC(void) {      P3DIR |= BIT1+BIT2;      P3OUT &=~BIT1; //P4DIR |= 0x80;        //SDA = 0      iic_Delay();iic_Delay();      P3OUT |=BIT2;//P4DIR &= 0xbf;        //SCL = 1      iic_Delay();iic_Delay();      P3OUT |=BIT1;//P4DIR &= 0x7f;        //SDA = 1      iic_Delay();iic_Delay();      P3OUT &=~BIT1;//P4DIR |= 0x80;        //SDA = 0      iic_Delay();iic_Delay();      P3OUT &= ~BIT2;//P4DIR |= 0x40;        //SCL = 0       } /******************************************************* *        发送 0 *******************************************************/ void send_Zero(void) {      P3DIR |= BIT1+BIT2;      P3OUT&= ~BIT1;//P4DIR |= 0x80;        //SDA = 0      iic_Delay();iic_Delay();      P3OUT|= BIT2;//P4DIR &= 0xbf;        //SCL = 1      iic_Delay();iic_Delay();      P3OUT &=~BIT2;//P4DIR |= 0x40;        //SCL = 0      iic_Delay();iic_Delay();       } /******************************************************* *        发送 1 *******************************************************/ void send_One(void) {         P3DIR |= BIT1+BIT2;      P3OUT|= BIT1;//P4DIR &= 0x7f;        //SDA = 1      iic_Delay();      iic_Delay();      P3OUT|= BIT2;//P4DIR &= 0xbf;        //SCL = 1      iic_Delay();      iic_Delay();      P3OUT&= ~BIT2;//P4DIR |= 0x40;        //SCL = 0      iic_Delay();      iic_Delay();      P3OUT&= ~BIT1;//P4DIR |= 0x80;        //SDA = 0      iic_Delay();iic_Delay();        } /******************************************************* *        发送一个字节数据 *******************************************************/ void send_Char(void) {      unsigned char cnt,tmp=0x80;      for(cnt=0;cnt 0)              {                   send_One();             // 发送1              }else              {                   send_Zero();        // 发送0              }              tmp /= 2;                // tmp右移一位      }        } /******************************************************* *        读一个byte数据 *******************************************************/ void read_Char(void) {      unsigned char cnt,tmp=0x80;      read_Buf = 0x00;            for(cnt=0;cnt 0x00)              {               // 收到 1                  read_Buf |= tmp;              }                      P3OUT&=~BIT2;//P4DIR |= 0x40;  //SCL = 0              iic_Delay();              tmp = tmp/2;                   }       } /************************************************* *        应答信号 *************************************************/ void iic_ACK(void) {           ack_Flag = 0x00;      P3DIR |= BIT1+BIT2;      P3OUT|=BIT1;//P4DIR   &= 0x7f;        //SDA = 1      iic_Delay();      iic_Delay();      P3OUT|= BIT2;//P4DIR   &= 0xbf;        //SCL = 1      iic_Delay();iic_Delay();      P3DIR &= ~BIT1;      if ((P3IN & BIT1) == BIT1 )//if ((P4IN & 0x80) == 0x80 )      {              ack_Flag = 0x01;      }            P3OUT&=~BIT2;//P4DIR   |=  0x40;        //SCL = 0      iic_Delay();iic_Delay();        } /*********************************************** *  iic_NACK ************************************************/ void iic_NACK(void) {      P3DIR |= BIT1+BIT2;      P3OUT |=BIT1;//P4DIR   &= 0x7f;        //SDA = 1      iic_Delay();      P3OUT |= BIT2;//P4DIR   &= 0xbf;        //SCL = 1      iic_Delay();      P3OUT &=~BIT2;//P4DIR   |= 0x40;        //SCL = 0           iic_Delay();      P3OUT &=~BIT1;//P4DIR   |= 0x80;        //SDA = 0      iic_Delay(); } /************************************************* *   iic_SENDACK *************************************************/ void iic_SENDACK(void)  //send the answer bit {         P3DIR   |= 10;//SDA=0;         iic_Delay();         P3DIR   &= 11111011;//SCL=1;         iic_Delay();//NOP();         P3DIR   |= 100;//SCL=0;              iic_Delay();         P3DIR   &=11111101;//SDA=1;         iic_Delay();    } /*************************************************** *  iic_Write ***************************************************/ void iic_Write() {         do         {iic_Delay();iic_Delay();iic_Delay();iic_Delay();        iic_Delay();iic_Delay();iic_Delay();iic_Delay();        iic_Delay();iic_Delay();                 start_IIC();//I2cStartBit();                 ctrl_Buf=0X70;//addr_Buf1;                 send_Char();//I2cWriteByte(slaw);                 iic_ACK();//I2cTestAck();                         }         while(ack_Flag==1);//while(F0==1);         ctrl_Buf=0X06;//write_Buf;         send_Char();//I2cWriteByte(Buffer[Index]);         iic_ACK();//I2cTestAck();         stop_IIC(); } /*************************************************** *  iic_Read ***************************************************/ void iic_Read() {         //unsigned char OneByte;                 //unsigned char i;          do         {                 start_IIC();//I2cStartBit();                 ctrl_Buf=0X4f;//addr_Buf2;                 send_Char();//I2cWriteByte(slaw);                 iic_ACK();//I2cTestAck();         }         while(ack_Flag==1);//while(F0==1);         read_Char();         iic_NACK();         stop_IIC(); } void main() { WDTCTL=WDTPW+WDTHOLD; //关看门狗      BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ      DCOCTL =CALBC1_1MHZ;                 //start_IIC();//I2cStartBit();                 //ctrl_Buf=0X00;//addr_Buf2;                 //send_Char();//I2cWriteByte(slaw);                 //iic_ACK();//I2cTestAck();      while(1)      {        iic_Write();             } }   详情 回复 发表于 2009-12-10 01:18
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
顺便说一下,我用的是msp430f2274
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我的源程序如下
#include "msp430x22x4.h"

unsigned int RxByteCtr;
/*********************************************************
*        数据定义
*********************************************************/
unsigned char read_Buf,         //读缓冲区
              write_Buf, //写缓冲区
              ctrl_Buf,  //用于存放控制指令等的中间缓冲区
              addr_Buf1,  //高地址缓冲
              addr_Buf2,
              ack_Flag;  //应答标识
/************************************************
*        延迟
************************************************/
void iic_Delay(void)
{
   _NOP();
   _NOP();
   _NOP();   
}
/*********************************************************
*        启动IIC
*********************************************************/
void start_IIC(void)
{
     //P3DIR &= 11111001;//P4OUT &= 0x3f;        //设置P4OUT
     P3DIR |= BIT1+BIT2;//P4DIR &= 0x7f;        //SDA = 1
     P3OUT |=BIT1;     
     iic_Delay();
     iic_Delay();
     //P3DIR |= BIT2;
     P3OUT |=BIT2;//P4DIR &= 0xbf;        //SCL = 1
     iic_Delay();iic_Delay();
     P3OUT &= ~BIT1;//P4DIR |= 0x80;        //SDA = 0
     iic_Delay();iic_Delay();
     P3OUT &= ~BIT2;//P4DIR |= 0x40;        //SCL = 0
     iic_Delay();iic_Delay();
}
/*******************************************************
*        停止IIC
*******************************************************/
void stop_IIC(void)
{
     P3DIR |= BIT1+BIT2;
     P3OUT &=~BIT1; //P4DIR |= 0x80;        //SDA = 0
     iic_Delay();iic_Delay();
     P3OUT |=BIT2;//P4DIR &= 0xbf;        //SCL = 1
     iic_Delay();iic_Delay();
     P3OUT |=BIT1;//P4DIR &= 0x7f;        //SDA = 1
     iic_Delay();iic_Delay();
     P3OUT &=~BIT1;//P4DIR |= 0x80;        //SDA = 0
     iic_Delay();iic_Delay();
     P3OUT &= ~BIT2;//P4DIR |= 0x40;        //SCL = 0
     
}

/*******************************************************
*        发送 0
*******************************************************/
void send_Zero(void)
{
     P3DIR |= BIT1+BIT2;
     P3OUT&= ~BIT1;//P4DIR |= 0x80;        //SDA = 0
     iic_Delay();iic_Delay();
     P3OUT|= BIT2;//P4DIR &= 0xbf;        //SCL = 1
     iic_Delay();iic_Delay();
     P3OUT &=~BIT2;//P4DIR |= 0x40;        //SCL = 0
     iic_Delay();iic_Delay();
     
}
/*******************************************************
*        发送 1
*******************************************************/
void send_One(void)
{   
     P3DIR |= BIT1+BIT2;
     P3OUT|= BIT1;//P4DIR &= 0x7f;        //SDA = 1
     iic_Delay();
     iic_Delay();
     P3OUT|= BIT2;//P4DIR &= 0xbf;        //SCL = 1
     iic_Delay();
     iic_Delay();
     P3OUT&= ~BIT2;//P4DIR |= 0x40;        //SCL = 0
     iic_Delay();
     iic_Delay();
     P3OUT&= ~BIT1;//P4DIR |= 0x80;        //SDA = 0
     iic_Delay();iic_Delay();       
}
/*******************************************************
*        发送一个字节数据
*******************************************************/
void send_Char(void)
{
     unsigned char cnt,tmp=0x80;
     for(cnt=0;cnt<8;cnt++)
     {
             if((ctrl_Buf & tmp )> 0)
             {
                  send_One();             // 发送1
             }else
             {
                  send_Zero();        // 发送0
             }
             tmp /= 2;                // tmp右移一位
     }       
}

/*******************************************************
*        读一个byte数据
*******************************************************/
void read_Char(void)
{
     unsigned char cnt,tmp=0x80;
     read_Buf = 0x00;
     
     for(cnt=0;cnt<8;cnt++)
     {
             P3DIR |= BIT1+BIT2;
        P3OUT |=BIT1;//P4DIR &= 0x7f;        //SDA = 1
             iic_Delay();
            
        P3OUT|=BIT2;//P4DIR &= 0xbf;        //SCL = 1       
             iic_Delay();
             P3DIR &= ~BIT1;
        if((P3IN & BIT1) == BIT1)//if((P4IN & 0x80) > 0x00)
             {               // 收到 1
                 read_Buf |= tmp;
             }
            
        P3OUT&=~BIT2;//P4DIR |= 0x40;  //SCL = 0
             iic_Delay();
             tmp = tmp/2;
            
     }
     
}

/*************************************************
*        应答信号
*************************************************/
void iic_ACK(void)
{     
     ack_Flag = 0x00;
     P3DIR |= BIT1+BIT2;
     P3OUT|=BIT1;//P4DIR   &= 0x7f;        //SDA = 1
     iic_Delay();
     iic_Delay();
     P3OUT|= BIT2;//P4DIR   &= 0xbf;        //SCL = 1
     iic_Delay();iic_Delay();
     P3DIR &= ~BIT1;
     if ((P3IN & BIT1) == BIT1 )//if ((P4IN & 0x80) == 0x80 )
     {
             ack_Flag = 0x01;
     }
     
     P3OUT&=~BIT2;//P4DIR   |=  0x40;        //SCL = 0
     iic_Delay();iic_Delay();
      
}
/***********************************************
*  iic_NACK
************************************************/
void iic_NACK(void)
{
     P3DIR |= BIT1+BIT2;
     P3OUT |=BIT1;//P4DIR   &= 0x7f;        //SDA = 1
     iic_Delay();
     P3OUT |= BIT2;//P4DIR   &= 0xbf;        //SCL = 1
     iic_Delay();
     P3OUT &=~BIT2;//P4DIR   |= 0x40;        //SCL = 0     
     iic_Delay();
     P3OUT &=~BIT1;//P4DIR   |= 0x80;        //SDA = 0
     iic_Delay();
}
/*************************************************
*   iic_SENDACK
*************************************************/
void iic_SENDACK(void)  //send the answer bit
{
        P3DIR   |= 10;//SDA=0;
        iic_Delay();
        P3DIR   &= 11111011;//SCL=1;
        iic_Delay();//NOP();
        P3DIR   |= 100;//SCL=0;     
        iic_Delay();
        P3DIR   &=11111101;//SDA=1;
        iic_Delay();
  
}

/***************************************************
*  iic_Write
***************************************************/
void iic_Write()
{
        do
        {iic_Delay();iic_Delay();iic_Delay();iic_Delay();
       iic_Delay();iic_Delay();iic_Delay();iic_Delay();
       iic_Delay();iic_Delay();
                start_IIC();//I2cStartBit();
                ctrl_Buf=0X70;//addr_Buf1;
                send_Char();//I2cWriteByte(slaw);
                iic_ACK();//I2cTestAck();
               
        }
        while(ack_Flag==1);//while(F0==1);
        ctrl_Buf=0X06;//write_Buf;
        send_Char();//I2cWriteByte(Buffer[Index]);
        iic_ACK();//I2cTestAck();
        stop_IIC();
}
/***************************************************
*  iic_Read
***************************************************/
void iic_Read()
{
        //unsigned char OneByte;
                //unsigned char i;
         do
        {
                start_IIC();//I2cStartBit();
                ctrl_Buf=0X4f;//addr_Buf2;
                send_Char();//I2cWriteByte(slaw);
                iic_ACK();//I2cTestAck();
        }
        while(ack_Flag==1);//while(F0==1);
        read_Char();
        iic_NACK();
        stop_IIC();

}


void main()
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
     BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ
     DCOCTL =CALBC1_1MHZ;
                //start_IIC();//I2cStartBit();
                //ctrl_Buf=0X00;//addr_Buf2;
                //send_Char();//I2cWriteByte(slaw);
                //iic_ACK();//I2cTestAck();
     while(1)
     {
       iic_Write();
      
     }
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表