[求助] msp430g2553的软件模拟 老是读出FF请各位大神帮一下忙

wangxiangshifei   2014-10-10 09:59 楼主
#define CPU_F ((double)1000000)
#define delayus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时x微秒
#define delayms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //延时x毫秒
#define uchar    unsigned char
#define uint     unsigned int
#define SDA_OUT  P1DIR|=BIT3
#define SDA_IN   P1DIR&=~BIT3
#define SDA_H    P1OUT|=BIT3
#define SDA_L    P1OUT&=~BIT3
#define SCL_OUT  P1DIR|=BIT4
#define SCL_IN   P1DIR&=~BIT4
#define SCL_H    P1OUT|=BIT4
#define SCL_L    P1OUT&=~BIT4
uint RXdata[1] = { 0x00 };
uint RXdata1[1] = { 0x00 };


/****************************
*初始化管脚
***************************/
void Port_Init() {
        P1DIR |= BIT3 + BIT4;
        SDA_OUT;
        SCL_OUT;
        SCL_H;
        SDA_H;
        SCL_L;
        SDA_L;
}
/******************************
*
* 开始IIC
*
*****************************/

void IIC_Start(void) {
        SCL_H;        //拉高
        SDA_H;        //拉高
        delayus(5);
        //建立起始条件4.7us
        SDA_L;        //产生下降沿发送起始信号
        delayus(5);
        //锁定起始信号
        SCL_L;        //等待数据
        delayus(5);
}
/**************************
*产生一个发送应答信号
*************************/
void IIC_WriteAck() {
        SDA_IN;
        SCL_OUT;
        delayus(1);

        SDA_L;
        delayus(5);
        SCL_H;
        delayus(5);
        SCL_L;
        delayus(5);
        delayus(10);
}
/*************************
* 产生一个接受应答信号
************************/
void IIC_SendNAck() {
        SDA_OUT;
        SCL_OUT;
        delayus(1);

        SDA_H;
        SCL_H;
        delayus(5);
        SCL_L;
        SDA_L;
        delayus(5);
        delayus(10);

}

/*****************************
*
* 停止IIC
*
*****************************/

void IIC_Stop() {
        SDA_OUT;
        SCL_OUT;
        delayus(1);
        SDA_L;
        delayus(5);
        SCL_H;
        delayus(5);
        SDA_H;
        delayus(5);
}
/*****************************
* 发送一个字节
*****************************/
void IIC_Write_One_Byte(uint TxData) {

        uint i = 0;
        for (i = 0; i < 8; i++) {
                if (TxData & 0x80)
                        SDA_H;
                else
                        SDA_L;
                TxData <<= 1;
                SCL_H;                  //时钟上升沿发送数据有效
                delayus(5);
                SCL_L;
                delayus(5);
        }
        SDA_OUT;
}

/**************************
*
* 读取一个字节
*
***************************/

void IIC_Read_One_Byte(uint *Data) {
        uint i = 0, data = 0;
        SDA_IN;
        for (i = 0; i < 8; i++) {
                data <<= 1;
                SCL_H;
                delayus(3);
                if (P1IN & BIT3) {
                        data |= 0x01;
                } else {
                        data &= 0xFE;
                }
                delayus(1);
                SCL_L;
                delayus(5);
        }
        SDA_OUT;                //接收结束的时候还要吧SDA的方向切换过来
        Data[0] = data;
}

回复评论 (2)

过来学习学习~~~~~~~~~~~~~~~~~~~~
点赞  2014-10-10 15:21
引用: kemasz 发表于 2014-10-10 15:21
过来学习学习~~~~~~~~~~~~~~~~~~~~

终于改好了
点赞  2014-10-15 14:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复