MSP430口線(xiàn)模擬I2C總線(xiàn)

發(fā)布時(shí)間:2008-11-4 21:08    發(fā)布者:MSP430
關(guān)鍵詞: MSP , 模擬 , 總線(xiàn)

MSP430口線(xiàn)模擬I2C總線(xiàn)

/**********************************************************************************************功能: 實(shí)現MSP430口線(xiàn)模擬I2C總線(xiàn)協(xié)議與24C04通信.                                           *
* 描述: 主系統工作時(shí)鐘為12MHz,I2C工作時(shí)鐘頻率為1MHz.給某地址寫(xiě)入一個(gè)數據     *
*         再讀出來(lái),如寫(xiě)入前和讀出后的數據一致,則P1.0輸出高電平,否則輸出低電        *
*         平.                                                                                                                   *
*                                                  /|\    /|\                                                                     *
*               MSP430x22x4          10k   10k  ATMEL 24c04                                           *    
*                   master                     |      |       slave                                                       *
*             ---------------------------    |      |    ----------                                                      *
*           -|XIN     P3.1/UCB0SDA|<-|----+>|SDA      |                                                     *
*  32kHz |                                  |   |         |             |                                                     *
*           -|XOUT                         |    |        |             |                                                     *
*            |          P3.2/UCB0SCL|<-+-----> |SCL     |                                                      *
*            |                                  |             |             |                                                      *
*             --------------------------                ----------                                                       *
*                                                                                                                                 *
* 作者: Singel                                                                                                             *
* 時(shí)間: 2008年10月17日22時(shí)35分                                                                             *
*       此例在 IAR Embedded Workbench IDE for MSP430 v3.42a 調試通過(guò) .            *
********************************************************************************************/


#include <MSP430x22x4.h>
#define  SlaveWriteAddress  0xa0
#define  SlaveReadAddress   0xa1
#define  OwnAddress         0xee
#define  I2CSDA             BIT1
#define  I2CSCL             BIT2
#define  I2CSDA_SET_1       P3OUT |=  I2CSDA
#define  I2CSDA_SET_0       P3OUT &=~ I2CSDA
#define  I2CSCL_SET_1       P3OUT |=  I2CSCL
#define  I2CSCL_SET_0       P3OUT &=~ I2CSCL
#define  I2CSDA_INPUT_IN    P3IN&I2CSDA

unsigned char READI2CBUF;

void delay5us( void )
    {
      unsigned char count=8;
      while(count--);
    }     

void Delay_MS( unsigned int m )
    {   
      unsigned int i,j;
      for(i=0;i<m;i++)
          for(j=0;j<125;j++);
    }
void Setting_System_Clock_For_On_Chip_RC( char Frequency )
    {
      switch (Frequency)
        {
          case 1 COCTL = BCSCTL1 = CALBC1_1MHZ;break;
          case 8 COCTL = BCSCTL1 = CALBC1_8MHZ;break;
          case 12COCTL = BCSCTL1 = CALBC1_12MHZ;break;
          case 16COCTL = BCSCTL1 = CALBC1_16MHZ;break;
        }   
    }

void I2C_Pins_DIR_Setting ( unsigned char SDADIR )
    {
      P3DIR  |= I2CSDA + I2CSCL;
      if(SDADIR==1)
        {
          P3DIR &=~ I2CSDA;
          P3OUT &=~ I2CSDA;
        }
    }

void Engender_I2C_start_signal(void)
    {
      I2CSCL_SET_1;  delay5us();
      I2CSDA_SET_1;  delay5us();
      I2CSDA_SET_0;  delay5us();
    }       
void Engender_I2C_stop_signal(void)
    {
      I2CSDA_SET_0;  delay5us();
      I2CSCL_SET_1;  delay5us();
      I2CSDA_SET_1;  delay5us();
    }       
void Engender_I2C_ack_signal(void)
    {    
      I2CSCL_SET_0;  delay5us();
      I2CSCL_SET_1;  delay5us();
      I2CSCL_SET_0;  delay5us();
    }         
void Engender_I2C_noack_signal(void)  
    {
      I2CSDA_SET_1;  delay5us();
      I2CSCL_SET_0;  delay5us();
      I2CSCL_SET_1;  delay5us();
      I2CSCL_SET_0;  delay5us();
    }  

void WRITE_BYTE_TO_24C04( unsigned char BytEDAta )  
    {
      unsigned char count;
      for(count=0;count<8;count++)
        {
          I2CSCL_SET_0;
          delay5us();
          if(BytEDAta&0x80)I2CSDA_SET_1;
          else             I2CSDA_SET_0;
          delay5us();
          I2CSCL_SET_1;
          delay5us();
          BytEDAta<<=1;
        }
    }         
unsigned char READ_BYTE_TO_24C04( void )
    {
      unsigned char count,readbyte=0;
      I2CSCL_SET_0;
      for(count=0;count<8;count++)
        {
          readbyte=readbyte<<1;
          I2CSCL_SET_1;
          delay5us();
          if(I2CSDA_INPUT_IN)readbyte=readbyte|0x01;
          else               readbyte=readbyte&0xfe;
          delay5us();
          I2CSCL_SET_0;
          delay5us();
        }
      I2CSCL_SET_0;
      return readbyte;
    }       
void WRITE_DATA_TO_24C04( unsigned char Address,unsigned char Date )
    {
      Setting_System_Clock_For_On_Chip_RC(1);
      I2C_Pins_DIR_Setting(0);
      Engender_I2C_start_signal();
      WRITE_BYTE_TO_24C04(SlaveWriteAddress);
      Engender_I2C_ack_signal();
      WRITE_BYTE_TO_24C04(Address);
      Engender_I2C_ack_signal();
      WRITE_BYTE_TO_24C04(Date);
      Engender_I2C_ack_signal();
      Engender_I2C_stop_signal();
      Delay_MS(15);
      I2CSCL_SET_0;
      I2CSDA_SET_0;
      Setting_System_Clock_For_On_Chip_RC(12);
     }          
unsigned char READ_DATA_FROM_24C04( unsigned char Address )
    {
      unsigned char readdate;
      Setting_System_Clock_For_On_Chip_RC(1);
      I2C_Pins_DIR_Setting(0);
      Engender_I2C_start_signal();
      WRITE_BYTE_TO_24C04(SlaveWriteAddress);
      Engender_I2C_ack_signal();
      WRITE_BYTE_TO_24C04(Address);
      Engender_I2C_ack_signal();
      Delay_MS(15);        
      Engender_I2C_start_signal();
      WRITE_BYTE_TO_24C04(SlaveReadAddress);
      I2C_Pins_DIR_Setting(1);
      Engender_I2C_ack_signal();
      readdate=READ_BYTE_TO_24C04();
      I2C_Pins_DIR_Setting(0);    
      Engender_I2C_noack_signal();
      Engender_I2C_stop_signal();
      I2CSCL_SET_0;
      I2CSDA_SET_0;   
      Setting_System_Clock_For_On_Chip_RC(12);
      return (readdate);
    }

void main( void )                   
    {
      unsigned char Data=0x59;
      WDTCTL  =  WDTPW+WDTHOLD;  
      Setting_System_Clock_For_On_Chip_RC(12);           
      P1DIR |= BIT0;
      while(1)
        {
          WRITE_DATA_TO_24C04(0X00,Data);
          READI2CBUF=READ_DATA_FROM_24C04(0x00);
          if(Data == READI2CBUF)
            {
              P1OUT |=  BIT0;
            }
          else
            {
              P1OUT &=~ BIT0;
            }
          Delay_MS(15);
        }
    }
本文地址:http://selenalain.com/thread-2880-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
maanzhenhow 發(fā)表于 2011-4-13 08:53:33
謝謝了
maanzhenhow 發(fā)表于 2011-4-13 08:53:52
太謝謝了
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)在線(xiàn)工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页