MSP430 - Software Simulation II2C Example

Publisher:DazzlingSmileLatest update time:2018-05-03 Source: eefocusKeywords:msp430 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere
  1. #include  

  2. #define SDA BIT1  

  3. #define   SCL              BIT2  

  4.      

  5. #define  SEG_A  0xA0   //0x0200---0x027F    

  6. #define  SEG_B  0xB0   //0x0280---0x02FF  

  7. #define  SEG_C  0xC0   //0x0300---0x037F  

  8.  

  9. //0x0380---0x0400  

  10. __no_init char wokao@0x243;  

  11. //=============================  

  12.  char *send_ptr;  

  13.  char  DEVICE_ADR=0;  

  14.  char WORD_ADR=0;  

  15.  char  REC_DATA=0;  

  16.  char START_flag = 0;  

  17.  char STOP_flag = 0;  

  18.  char PreState = 0;  

  19.  char NowState = 0;  

  20. //*********************Function declaration*****************************************  

  21. void ACK(void);  

  22.  

  23. //****************************************************************  

  24. void main( void )  

  25. {  

  26.   // Stop watchdog timer to prevent time out reset  

  27.   WDTCTL = WDTPW + WDTHOLD;  

  28.    

  29.   //======================MCLK=16MHz=====================================  

  30.   DCOCTL = CALDCO_16MHZ;  

  31.   BCSCTL1 = CALBC1_16MHZ;    //MCLK=DCO=16MHz  

  32.  P3DIR &= ~(SDA+SCL);  

  33.   while(1)  

  34.   {  

  35.     NN=10;  

  36.     PreState = READ_SDA;  

  37.     while(READ_SCL && NN--)  

  38.     {      

  39.       NowState = READ_SDA;  

  40.       if(PreState && !NowState)  

  41.       {  

  42.         START_flag = 1;  

  43.         _DINT();  

  44.       }  

  45.       if(!PreState && NowState)  

  46.       {  

  47.         STOP_flag = 1;  

  48.         _UNITE();  

  49.       }    

  50.       PreState = NowState;  

  51.       if(START_flag)  

  52.       {  

  53.         START_flag=0;  

  54.         while(READ_SCL); //Wait for SCL high level state at START  

  55.         for(gg=8;gg>0;gg--) //Receive device address  

  56.         {  

  57.           while(!READ_SCL); //Wait for SCL low level state  

  58.            

  59.           DEVICE_ADR<<=1;  

  60.           if(READ_SDA) //The first CLK high level of data comes  

  61.             DEVICE_ADR |= 0x01;  

  62.            

  63.           while(READ_SCL); //Wait for SCL high level state  

  64.         }  

  65.         ACK(); //ACK response to device address  

  66.         //-----------The above receives the device address and knows whether the host wants to read or write to the slave---  

  67.           

  68.         for(gg=8;gg>0;gg--) //Receive memory unit address  

  69.         {  

  70.           while(!READ_SCL);  

  71.            

  72.           WORD_ADR<<=1;  

  73.           if(READ_SDA)  

  74.             WORD_ADR |= 0x01;  

  75.            

  76.           while(READ_SCL);  

  77.         }      

  78.         //-----------The above has received the memory unit address------------  

  79.         ACK(); //ACK response signal to memory unit  

  80.           

  81.           

  82.         if(DEVICE_ADR & 0x01) //slave sends data to host R/W=1  

  83.         {  

  84.           if(DEVICE_ADR==SEG_A+0x01)  

  85.           {  

  86.             send_ptr =(char*)(0x0200 + WORD_ADR);  

  87.           }  

  88.           else if(DEVICE_ADR==SEG_B+0x01)  

  89.           {  

  90.             send_ptr =(char*)(0x0280 + WORD_ADR);  

  91.           }  

  92.           else if(DEVICE_ADR==SEG_C+0x01)  

  93.           {  

  94.             send_ptr =(char*)(0x0300 + WORD_ADR);  

  95.           }  

  96.            

  97.           //--------The above is to determine that the host is reading the slave, and assign the address unit to be read to the pointer---  

  98.            

  99.           for(gg=8;gg>0;gg--)  

  100.           {  

  101.             while(!READ_SCL);  

  102.             if( *send_ptr & 0x80)  

  103.               _NOP();  

  104.             else  

  105.             {  

  106.               P3DIR |= SDA; //output 0  

  107.             }  

  108.             while(READ_SCL); //SCL is 1, then keep SDA output unchanged  

  109.             P3DIR &= ~SDA; //When SCL is 0, switch SDA back to receiving state  

  110.             *send_ptr <<=1;  

  111.           }  

  112.           ACK(); //Slave data transmission completed, response signal  

  113.           _NOP();  

  114.           //------------------The above is the data sent from the machine to the host-----------------  

  115.         }  

  116.         else //Host writes to slave R/W=0  

  117.         {  

  118.           for(gg=8;gg>0;gg--) //Receive the data that the host wants to write to the memory unit of the device  

  119.           {  

  120.             while(!READ_SCL);  

  121.              

  122.             REC_DATA <<=1;  

  123.             if(READ_SDA)  

  124.               REC_DATA |= 0x01;  

  125.              

  126.             while(READ_SCL);  

  127.           }  

  128.           if(DEVICE_ADR==SEG_A)  

  129.           {  

  130.             send_ptr =(char*)(0x0200 + WORD_ADR);  

  131.             *send_ptr = REC_DATA;  

  132.           }  

  133.           else if(DEVICE_ADR==SEG_B)  

  134.           {  

  135.             send_ptr =(char*)(0x0280 + WORD_ADR);  

  136.             *send_ptr = REC_DATA;  

  137.           }  

  138.           else if(DEVICE_ADR==SEG_C)  

  139.           {  

  140.             send_ptr =(char*)(0x0300 + WORD_ADR);  

  141.             *send_ptr = REC_DATA;  

  142.           }  

  143.           ACK();    

  144.           _NOP();  

  145.           while(!READ_SCL);  

  146.         }  

  147.       }// if(START_flag)  

  148.        

  149.     }//while(NN--)  

  150.     _UNITE();  

  151.     _NOP();  

  152.   }//while(1)  

  153. }  

  154. //****************************************************  

  155. void ACK(void)  

  156. {  

  157.   // while(READ_SCL);  

  158.   while(!READ_SCL);  

  159.   P3DIR |= SDA; //When the 9th CLK goes high, SDA outputs 0  

  160.   while(READ_SCL);    

  161.   P3DIR &= ~SDA; //When the 9th CLK goes low, SDA outputs 1  

  162. }  


Keywords:msp430 Reference address:MSP430 - Software Simulation II2C Example

Previous article:MSP430 FAQ
Next article:Some understanding of MSP430

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号