[Kinetis] I2C模拟驱动

[复制链接]
899|4
 楼主| ccw1986 发表于 2016-1-22 21:02 | 显示全部楼层 |阅读模式
  1. *******************************************************************************
  2. *
  3. *
  4. *
  5. ******************************************************************************/

  6. #include "sw_iic.h"

  7. //----I2C Variables -------------------------------------------------------
  8. byte ak1=NACK;
  9. byte ak2=NACK;
  10. byte ak3=NACK;
  11. //-------------------------------------------------------------------------

  12. /**************************************************************
  13. *        Function:         Delay
  14. *        Parameters: 16-bit delay value
  15. *        Return:                none
  16. *
  17. *        Simple delay loop.
  18. **************************************************************/
  19. void SwIIC_Delay(byte count)
  20. {
  21.         byte i;
  22.         for (i=0; i<count; i++)
  23.         {
  24.     //asm nop;           
  25.         }
  26. }

  27. /**************************************************************
  28. *        Function:         Wait
  29. *        Parameters: 8-bit delay value
  30. *        Return:                none
  31. *
  32. *        Simple delay loop. Little longer than delay function.
  33. **************************************************************/
  34. void SwIIC_Wait(byte loop)
  35. {
  36. while(--loop);
  37. {                     
  38.     //asm nop;      
  39. }
  40. }

  41. /**************************************************************
  42. *        Function:         SwIIC_Init
  43. *        Parameters: none
  44. *        Return:                none
  45. *
  46. *        Function initialize sw IIC interface
  47. **************************************************************/
  48. void SwIIC_Init(void)
  49. {
  50.   SCL_D = P_IN;
  51.   SDA_D = P_IN;
  52.   SS_D = P_OUT;
  53.   SCL_PU = PU_ON;
  54.   SDA_PU = PU_ON;
  55.   SS=1;                 
  56. }

  57. /**************************************************************
  58. *        Function:         IIC_DATA_0                 
  59. *        Parameters: none
  60. *        Return:                none
  61. *
  62. *        Physical layer of IIC - Write '0' on bus   
  63. **************************************************************/
  64. void IIC_DATA_0(void)
  65. {
  66.   word i = 0;
  67.   
  68.   SDA = 0;
  69.   SDA_D = P_OUT;
  70.   SwIIC_Wait(SDA_HOLD);
  71.   SCL_D = P_IN;
  72.   while((!SCL) && (i++ < MAX_IIC_TIMEOUT));
  73.   SwIIC_Wait(SCL_HOLD);
  74.   SCL = 0;
  75.   SCL_D = P_OUT;
  76.   SwIIC_Wait(SCL_HOLD);
  77. }

  78. /**************************************************************
  79. *        Function:         IIC_DATA_1               
  80. *        Parameters: none
  81. *        Return:                none
  82. *
  83. *        Physical layer of IIC - Write '1' on bus   
  84. **************************************************************/
  85. void IIC_DATA_1(void)
  86. {
  87.   word i = 0;
  88.   
  89.   SDA_D = P_IN;
  90.   SwIIC_Wait(SDA_HOLD);
  91.   SCL_D = P_IN;
  92.   while((!SCL) && (i++ < MAX_IIC_TIMEOUT));
  93.   SwIIC_Wait(SCL_HOLD);
  94.   SCL = 0;
  95.   SCL_D = P_OUT;
  96.   SwIIC_Wait(SCL_HOLD);
  97. }

  98. /**************************************************************
  99. *        Function:         IIC_GetBit                       
  100. *        Parameters: none
  101. *        Return:                value of bit on bus
  102. *
  103. *        Physical layer of IIC - Read a bit from bus IIC
  104. **************************************************************/
  105. byte IIC_GetBit(void)
  106. {
  107.   byte level;
  108.   word i = 0;

  109.   SDA_D = P_IN;
  110.   SwIIC_Wait(SDA_HOLD);
  111.   SCL_D = P_IN;
  112.   while((!SCL) && (i++ < MAX_IIC_TIMEOUT));
  113.   SwIIC_Wait(SCL_HOLD);
  114.   level = SDA;
  115.   SCL = 0;
  116.   SCL_D = P_OUT;
  117.   SwIIC_Wait(SCL_HOLD);
  118.   return level;  
  119. }


 楼主| ccw1986 发表于 2016-1-22 21:03 | 显示全部楼层
  1. /**************************************************************
  2. *        Function:         IIC_START                  
  3. *        Parameters: none
  4. *        Return:                none
  5. *
  6. *        Physical layer of IIC - Set up START condition on bus
  7. **************************************************************/
  8. void IIC_START(void)
  9. {
  10.   SDA = 0;
  11.   SDA_D = P_OUT;
  12.   SwIIC_Wait(SDA_HOLD);
  13.   SCL = 0;
  14.   SCL_D = P_OUT;
  15.   SwIIC_Wait(SCL_HOLD);
  16. }

  17. /**************************************************************
  18. *        Function:         IIC_REPEAT_START              
  19. *        Parameters: none
  20. *        Return:                none
  21. *
  22. *        Physical layer of IIC - Set up REPEAT_START condition on bus
  23. **************************************************************/
  24. void IIC_REPEAT_START(void)
  25. {
  26.   word i = 0;
  27.   
  28.   SDA_D = P_IN;
  29.   SwIIC_Wait(SDA_HOLD);
  30.   SCL_D = P_IN;
  31.   while((!SCL) && (i++ < MAX_IIC_TIMEOUT));
  32.   SwIIC_Wait(SCL_HOLD);
  33.   IIC_START();
  34. }

  35. /**************************************************************
  36. *        Function:         IIC_STOP                       
  37. *        Parameters: none
  38. *        Return:                none
  39. *
  40. *        Physical layer of IIC - Set up STOP condition on bus
  41. **************************************************************/
  42. void IIC_STOP(void)
  43. {
  44.   word i = 0;
  45.   
  46.   SDA = 0;
  47.   SDA_D = P_OUT;
  48.   SwIIC_Wait(SDA_HOLD);
  49.   SCL_D = P_IN;
  50.   while((!SCL) && (i++ < MAX_IIC_TIMEOUT));
  51.   SwIIC_Wait(SCL_HOLD);
  52.   SDA_D = P_IN;
  53.   SwIIC_Wait(SDA_HOLD);
  54. }

  55. /**************************************************************
  56. *        Function:         SwIIC_SendAddressWrite         
  57. *        Parameters: tx_byte
  58. *        Return:                none
  59. *
  60. *        Send device address on bus with write flag
  61. **************************************************************/
  62. void SwIIC_SendAddressWrite(byte tx_byte)
  63. {
  64.   byte k;

  65.   tx_byte <<= 1;   
  66.   tx_byte &= 0xfe;  

  67.   for(k=8;k>0;k--)   
  68.   {                                
  69.     if (tx_byte & 0x80)            
  70.       IIC_DATA_1();               
  71.     else
  72.       IIC_DATA_0();
  73.     tx_byte <<= 1;
  74.   }
  75.   ak1=IIC_GetBit();
  76. }
  77.    

  78. /**************************************************************
  79. *        Function:         SwIIC_SendAddressRead           
  80. *        Parameters: tx_byte
  81. *        Return:                none
  82. *
  83. *        Send device address on bus with read flag
  84. **************************************************************/
  85. void SwIIC_SendAddressRead(byte tx_byte)
  86. {
  87.   byte k;           

  88.   tx_byte <<= 1;      
  89.   tx_byte |= 0x01;   
  90.                                           
  91.   for(k=8;k>0;k--)   
  92.   {                                                                    
  93.     if (tx_byte & 0x80)                                                
  94.       IIC_DATA_1();
  95.     else
  96.       IIC_DATA_0();
  97.     tx_byte <<= 1;
  98.   }
  99.   ak3=IIC_GetBit();
  100. }
  101.    
  102. /**************************************************************
  103. *        Function:         SwIIC_SendRegister               
  104. *        Parameters: tx_byte
  105. *        Return:                none
  106. *
  107. *        Send device internal register address on bus  
  108. **************************************************************/   
  109. void SwIIC_SendRegister(byte tx_byte)
  110. {
  111.   byte k;
  112.       
  113.   for(k=8;k>0;k--)   
  114.   {         
  115.     if (tx_byte & 0x80)
  116.       IIC_DATA_1();
  117.     else
  118.       IIC_DATA_0();
  119.     tx_byte <<= 1;
  120.   }
  121.   ak2=IIC_GetBit();
  122. }
 楼主| ccw1986 发表于 2016-1-22 21:04 | 显示全部楼层
  1. /**************************************************************
  2. *        Function:         IIC_ReadByte                    
  3. *        Parameters: ack
  4. *        Return:                val
  5. *
  6. *        Read a byte from IIC bus  
  7. **************************************************************/
  8. byte IIC_ReadByte(byte ack)      
  9. {                                 
  10. byte i, val;

  11.   for(i=8; i>0; i--)
  12.   {
  13.     val <<= 1;
  14.     val |= IIC_GetBit();
  15.   }
  16.   
  17.   if (ack == IIC_ACK)            
  18.     IIC_DATA_0();               
  19.   else
  20.     IIC_DATA_1();               
  21.                                                                      
  22.   return val;  
  23. }

  24. /**************************************************************
  25. *        Function:         IIC_SendByte                     
  26. *        Parameters: tx_byte
  27. *        Return:                none
  28. *
  29. *        Write a byte to IIC bus  
  30. **************************************************************/
  31. void IIC_SendByte(byte tx_byte)
  32. {
  33.   byte k;      

  34.   for(k=8;k>0;k--)   
  35.   {         
  36.     if (tx_byte & 0x80)
  37.       IIC_DATA_1();
  38.     else
  39.       IIC_DATA_0();
  40.     tx_byte <<= 1;
  41.   }
  42.   ak3=IIC_GetBit();
  43. }

  44. byte IIC_SendByteM(byte tx_byte)
  45. {
  46.   byte k;      

  47.   for(k=8;k>0;k--)   
  48.   {         
  49.     if (tx_byte & 0x80)
  50.       IIC_DATA_1();
  51.     else
  52.       IIC_DATA_0();
  53.     tx_byte <<= 1;
  54.   }
  55.   
  56.   ak3=IIC_GetBit();
  57.   
  58.   return(ak3);
  59. }

  60. /**************************************************************
  61. *        Function:         SwIIC_ReadByte                  
  62. *        Parameters: RegAdd
  63. *        Return:                none
  64. *
  65. *        Complete data transfer - read a byte from device register
  66. * Note: Secured routine through check of acknowledge
  67. **************************************************************/
  68. byte SwIIC_ReadByte(byte RegAdd)                        
  69. {  
  70.       byte temp;
  71.       ak1=NACK;
  72.       ak2=NACK;
  73.       ak3=NACK;
  74.      
  75.       while(!(ak3==ACK))
  76.       {   
  77.         IIC_START();
  78.         SwIIC_Delay(START_DELAY);                 
  79.         SwIIC_SendAddressWrite(ION_ADDR);
  80.         SwIIC_Delay(ADDRESS_DELAY);  
  81.           if(!ak1)                                   
  82.           {
  83.           SwIIC_SendRegister(RegAdd);
  84.               if(!ak2)                              
  85.               {      
  86.               IIC_REPEAT_START();
  87.               SwIIC_Delay(START_DELAY);           
  88.               SwIIC_SendAddressRead(ION_ADDR);
  89.               if(!ak3) temp=IIC_ReadByte(IIC_NACK);  
  90.               }
  91.           }
  92.       IIC_STOP();
  93.       ak1=NACK;
  94.       ak2=NACK;
  95.       }  
  96.     return(temp);   
  97. }

  98. /**************************************************************
  99. *        Function:         SwIIC_WriteByte                  
  100. *        Parameters: RegAdd, RegVal
  101. *        Return:                none
  102. *
  103. *        Complete data transfer - write a byte to device (ION) register
  104. * Note: Secured routine through check of acknowledge
  105. **************************************************************/
  106. void SwIIC_WriteByte(byte RegAdd, byte RegVal)                     
  107. {     
  108.               
  109.       ak1=NACK;
  110.       ak2=NACK;
  111.       ak3=NACK;
  112.       
  113.       while(ak3)
  114.       {
  115.         IIC_START();
  116.         SwIIC_Delay(START_DELAY);  
  117.         SwIIC_SendAddressWrite(ION_ADDR);
  118.         SwIIC_Delay(ADDRESS_DELAY);   
  119.           if(!ak1)                                 
  120.           {
  121.               SwIIC_SendRegister(RegAdd);
  122.               SwIIC_Delay(ADDRESS_DELAY);
  123.               if(!ak2)                             
  124.               {
  125.               IIC_SendByte(RegVal);
  126.               }
  127.           }
  128.         IIC_STOP();
  129.         ak1=NACK;
  130.         ak2=NACK;
  131.       }           
  132. }

  133. /**************************************************************
  134. *        Function:         SwIIC_MultiRead                  
  135. *        Parameters: RegAdd, *buff (data), cnt - length
  136. *        Return:                none
  137. *
  138. *        Complete data transfer - multiple write a bytes to device (ION) registers
  139. * Note: Secured routine through check of acknowledge
  140. **************************************************************/
  141. void SwIIC_MultiReadBytes(byte RegAdd, byte *buff, byte cnt)        
  142. {  
  143.   byte i;
  144.   
  145.   i=0;
  146.   ak1=NACK;
  147.   ak2=NACK;
  148.   ak3=NACK;
  149.    
  150.       while(!(ak3==ACK))
  151.       {         
  152.        IIC_START();
  153.        SwIIC_Delay(START_DELAY);                 
  154.        SwIIC_SendAddressWrite(ION_ADDR);
  155.        SwIIC_Delay(ADDRESS_DELAY);
  156.        if(!ak1)
  157.        {
  158.         SwIIC_SendRegister(RegAdd);
  159.         if(!ak2)      
  160.         {
  161.          IIC_REPEAT_START();
  162.          SwIIC_SendAddressRead(ION_ADDR);
  163.          SwIIC_Delay(ADDRESS_DELAY);
  164.          if(!ak3)
  165.          {
  166.           for(i=0;i<(cnt - 1);i++)
  167.           {
  168.            *buff++ = IIC_ReadByte(IIC_ACK);
  169.           }
  170.           *buff++ = IIC_ReadByte(IIC_NACK);
  171.          }
  172.         }
  173.        }
  174.        IIC_STOP();
  175.        ak1=NACK;
  176.        ak2=NACK;
  177.       }
  178. }

  179. /**************************************************************
  180. *        Function:         SwIIC_MultiWrite               
  181. *        Parameters: RegAdd, *buff (data), cnt - length
  182. *        Return:                none
  183. *
  184. *        Complete data transfer - multiple write a bytes into device (ION) registers
  185. * Note: Secured routine through check of acknowledge
  186. **************************************************************/
  187. void SwIIC_MultiWriteBytes(byte RegAdd, byte *buff, byte cnt)
  188. {  
  189.   byte i,j,ak[32];
  190.   
  191.   i=0;
  192.   ak1=NACK;
  193.   ak2=NACK;
  194.   ak3=NACK;
  195.   for(j=0;j<32;j++) ak[j]=NACK;
  196.    
  197.       while(!(ak[cnt+2]==ACK))
  198.       {                                                   
  199.         IIC_START();
  200.         SwIIC_Delay(START_DELAY);                       
  201.         SwIIC_SendAddressWrite(ION_ADDR);
  202.         SwIIC_Delay(ADDRESS_DELAY);
  203.           if(!ak1)                                 
  204.           {              
  205.               SwIIC_SendRegister(RegAdd);      
  206.               SwIIC_Delay(ADDRESS_DELAY);
  207.               ak[2]=ak2;
  208.               while((!ak[i+2])&&(i<cnt))      
  209.               {
  210.                 ak[i+3]=IIC_SendByteM(*(buff++));
  211.                 i++;
  212.               }
  213.           }
  214.         IIC_STOP();
  215.         ak1=NACK;
  216.         for (j=0;j<(cnt-1);j++) ak[j+2]=NACK;
  217.       }
  218. }
 楼主| ccw1986 发表于 2016-1-22 21:05 | 显示全部楼层
  1. ***************************************************************************//*!
  2. *
  3. * [url=home.php?mod=space&uid=288409]@file[/url]      sw_iic.h
  4. *
  5. * [url=home.php?mod=space&uid=187600]@author[/url]    R20246
  6. *
  7. * [url=home.php?mod=space&uid=895143]@version[/url]   2.0.0.1
  8. *
  9. * [url=home.php?mod=space&uid=212281]@date[/url]      FEB-14-2008
  10. *
  11. * [url=home.php?mod=space&uid=247401]@brief[/url]     ION (MMA7455L) - Ion MMA7455L in Measure mode (using SPI or IIC)
  12. *
  13. *******************************************************************************
  14. *
  15. *
  16. *
  17. ******************************************************************************/
  18. #ifndef SW_IIC_H
  19. #define SW_IIC_H

  20. #include "derivative.h"

  21. #define ION_ADDR 0x1D /* ION address is 1D */

  22. #define SCL     PTCD_PTCD3        
  23. #define SCL_D   PTCDD_PTCDD3  
  24. #define SCL_PU  PTCPE_PTCPE3  
  25. #define SDA     PTCD_PTCD2        
  26. #define SDA_D   PTCDD_PTCDD2  
  27. #define SDA_PU  PTCPE_PTCPE2
  28. #define SS      PTBD_PTBD3      
  29. #define SS_D    PTBDD_PTBDD3      
  30. #define SS_PU   PTBPE_PTBPE3      

  31. #define P_OUT   1
  32. #define P_IN    0
  33. #define PU_ON   1
  34. #define PU_OFF  0

  35. #define ACK 0
  36. #define NACK 1

  37. #define IIC_ACK  0
  38. #define IIC_NACK 1

  39. #define START_DELAY 1
  40. #define ADDRESS_DELAY 1

  41. #define SDA_HOLD 5          //20MHz Bus Clock: 1  => IIC 110kHz
  42. #define SCL_HOLD 5          //                 5  => IIC  70kHz

  43. #define MAX_IIC_TIMEOUT 0x9F00

  44. // FUNCTION DECLARATION
  45. void SwIIC_Delay(byte);
  46. void SwIIC_Wait(byte);
  47. void IIC_DATA_0(void);
  48. void IIC_DATA_1(void);
  49. byte IIC_GetBit(void);
  50. void IIC_START(void);
  51. void IIC_REPEAT_START(void);
  52. void IIC_STOP(void);
  53. byte IIC_ReadByte(byte ack);
  54. void IIC_SendByte(byte tx_byte);
  55. byte IIC_SendByteM(byte tx_byte);
  56. void SwIIC_Init(void);
  57. void SwIIC_SendAddressWrite(byte tx_byte);
  58. void SwIIC_SendAddressRead(byte tx_byte);
  59. void SwIIC_SendRegister(byte tx_byte);
  60. byte SwIIC_ReadByte(byte RegAdd);
  61. void SwIIC_WriteByte(byte RegAdd, byte RegVal);
  62. void SwIIC_MultiReadBytes(byte num, byte *buff, byte cnt);
  63. void SwIIC_MultiWriteBytes(byte num, byte *buff, byte cnt);
  64.   
  65. #endif //SW_IIC_H
neeringstu 发表于 2016-1-23 20:51 | 显示全部楼层
这个需要保存啊,也可以用于其他单片机之类的吗
KL系列的iic不是挺好用的吗,为啥还要模拟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

925

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部