关于wince下I2C控制的参考代码

/
//title:关于I2C控制的一些注意问题
//descrpit:分析I2C总线工作原理和实现方法
//author:Mercury Xu
//date:2008-09-20
/
阅读本文前请先阅读完I2C协议手册,下载地址如下:
http://download.csdn.net/source/315355

最近的开发一直与I2C有关系。以前写过I2C通讯相关东西。但是用的是别人的封装函数。所以没有怎么仔细看。
这次通过开发MTV335这款芯片自己参考了原厂提供的代码写了一个I2C通讯的程序。没有做成类的形式,也是普通的函数调用。应该比较容易理解和使用。具体的操作如下,另外要提得一点是,在做I2C程序之前一定要硬件工程师帮你检查下或者你自己检查下线路是否通畅,上拉电阻是否使用正确,I2C两线的电压是否正常3.3-5V。检查完这些后,尝试送一组值给芯片,看下波型是否正确,如果正确就放心大胆的写东西吧,多话不说了,大家看参考代码吧。其中我使用了一些伪代码来替代一些操作,不同的芯片用不同的方式去替换就好了。

另,参考程序是基于wince5.0下流设备驱动形式编写,请按照各自不同的芯片进行修改。

  1. #ifndef _DEMO_H_ 
  2. #define _DEMO_H_
  3. #define DELAY_CNT   50         //Delay 50 us
  4. #define DEMO_WriteID  0x4A     //[DEMO] Write address
  5. #define DEMO_ReadID   0x4B     //[DEMO] Read  address
  6. #define   TIMERTICK    (v_pDriverGlobals->sysclk.dwSystemClock/(1000000*2))       //delay basic num
  7. #define   NTSC       1        //set show type
  8. typedef enum OPERA_MODE {
  9.     READ = 1,
  10.     WRITE = 2
  11. } T_OPERA_MODE;
  12. unsigned char DEMOTable[] = {
  13.     
  14.                                 
  15. 0x08,0xC0,0x33,0x00,0x00,0xE9,0x0D,0xB8,0x01,0x80,0x47,0x40,0x00,0x01,0x2A,0x38,
  16.                                 
  17. 0x0C,0xf7,0x01,0x3E,0x00,0x00,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  18.                                 
  19. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x07,
  20.                                 0x80,0x00
  21.                                 
  22.                              }; 
  23. unsigned char DEMOAddress[] = { 
  24.     
  25.                                  
  26. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
  27.                                  
  28. 0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x41,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,
  29.                                  
  30. 0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
  31.                                  0x5B,0x5E
  32.                                  
  33.                                 };
  34. // Copyright Mercury's CO.,LTD.2007-2008
  35. // Author : Mercury Xu
  36. // Descript: this file for DEMO chip,it's a dll entry function 
  37. // in this file include the DEMO_XXX function for driver the chip
  38. // as a stream device.At the same time,in the bsp package we define
  39. // other function for make suer that this device can reset.use 
  40. // centrality define function from gpio.h head file.
  41. //update log
  42. //create by : 2008-03-21 mercury xu 
  43. //add by : 2008-04-03 mercury xu add define into the file change old file struct.
  44. //add by : 2008-04-04 mercury xu add some variables for ioctr function
  45. //modify by : 2008-07-30 mercury xu change it for DEMO
  46. /
  47.         //=============================================================================
  48.         //Title : WrToDEMO
  49.         //Detail: Write Data To DEMO
  50.         //Input : addr data
  51.         //Output: none
  52.         //Author: Mercury Xu
  53.         //Data  : 2008-07-30
  54.         //=============================================================================
  55.         void WrToDEMO(unsigned char addr,unsigned char data);
  56.         //=============================================================================
  57.         //Title : initial_DEMO
  58.         //Detail: initial DEMO chip
  59.         //Input : none
  60.         //Output: none
  61.         //Author: Mercury Xu
  62.         //Data  : 2008-07-30
  63.         //=============================================================================
  64.         void initial_DEMO();
  65.         //=============================================================================
  66.         //Title : ReceiveAck
  67.         //Detail: Receive Ack from DEMO chip
  68.         //Input : none
  69.         //Output: int
  70.         //Author: Mercury Xu
  71.         //Data  : 2008-07-30
  72.         //=============================================================================
  73.         int ReceiveAck();
  74.         //=============================================================================
  75.         //Title : StopBit
  76.         //Detail: StopBit  from DEMO chip
  77.         //Input : none
  78.         //Output: none
  79.         //Author: Mercury Xu
  80.         //Data  : 2008-07-30
  81.         //=============================================================================
  82.         void StopBit();
  83.         //=============================================================================
  84.         //Title : StartBit
  85.         //Detail: StartBit  from DEMO chip
  86.         //Input : none
  87.         //Output: none
  88.         //Author: Mercury Xu
  89.         //Data  : 2008-07-30
  90.         //=============================================================================
  91.         void StartBit();
  92.         //=============================================================================
  93.         //Title : WrData
  94.         //Detail: WrData to DEMO chip
  95.         //Input : none
  96.         //Output: none
  97.         //Author: Mercury Xu
  98.         //Data  : 2008-07-30
  99.         //=============================================================================
  100.         void WrData(unsigned char data);
  101.         //=============================================================================
  102.         //Title : DEMO_reset
  103.         //Detail: DEMO_reset to DEMO chip
  104.         //Input : none
  105.         //Output: none
  106.         //Author: Mercury Xu
  107.         //Data  : 2008-07-30
  108.         //=============================================================================
  109.               //  void DEMO_reset();
  110. ///
  111. //modify by mercury xu  Mercury's 20080401
  112. //this segment for define some useful little function.usually use in the program.
  113. //there are including some functions as following words
  114. //sdio_high()
  115. //sdio_low()
  116. //sclk_high()
  117. //sclk_low()
  118. //sdio_output_enable()
  119. //sdio_input_enable()
  120. //sdio_getdata()
  121. ///
  122. //update log
  123. //create by mercury xu  20070401
  124. ///
  125. void sleepGPIO(long usVal);
  126. ///
  127. void sdio_high();
  128. ///
  129. void sdio_low();
  130. ///
  131. void sclk_high();
  132. ///
  133. void sclk_low();
  134. //
  135. void sdio_output_enable();
  136. //
  137. void sdio_input_enable();
  138. //
  139. int sdio_getdata();
  140. //end segment
  141. ///
  142. void sdio_reset();
  143. extern "C" unsigned char OperationDEMO(T_OPERA_MODE operation, unsigned char *data, unsigned char numBytes);
  144. /
  145. extern "C" BOOL CALLBACK DllMain(HANDLE hDLL,DWORD dwReason,LPVOID lpvReserved);
  146. //
  147. //------------------------------------------------------------------------------
  148. // @xref                          <nl>
  149. //          <f DEMO_Init>,         <nl>
  150. //          <f DEMO_Deinit>,       <nl>
  151. //          <f DEMO_Open>,         <nl>
  152. //          <f DEMO_Close>,        <nl>
  153. //          <f DEMO_Read>,         <nl>
  154. //          <f DEMO_Write>,        <nl>
  155. //          <f DEMO_Seek>,         <nl>
  156. //          <f DEMO_PowerUp>,      <nl>
  157. //          <f DEMO_PowerDown>,    <nl>
  158. //          <f DEMO_IOControl>     <nl>
  159. //
  160. // -----------------------------------------------------------------------------
  161. extern "C" DWORD DEMO_Init(DWORD Index);
  162. // -----------------------------------------------------------------------------
  163. //
  164. //  @doc    WDEV_EXT
  165. //
  166. //  @func   PVOID | DEMO_Deinit | Device deinitialization routine
  167. //
  168. //  @parm   DWORD | dwData | value returned from DEMO_Init call
  169. //
  170. //  @rdesc  Returns TRUE for success, FALSE for failure.
  171. //
  172. // -----------------------------------------------------------------------------
  173. //extern "C" BOOL DEMO_Deinit(DWORD dwData);
  174. // -----------------------------------------------------------------------------
  175. //
  176. //  @doc    WDEV_EXT
  177. //
  178. //  @func   PVOID | DEMO_Open    | Device open routine
  179. //
  180. //  @parm   DWORD | dwData      | Value returned from DEMO_Init call (ignored)
  181. //
  182. //  @parm   DWORD | dwAccess    | Requested access (combination of GENERIC_READ
  183. //                                and GENERIC_WRITE) (ignored)
  184. //
  185. //  @parm   DWORD | dwShareMode | Requested share mode (combination of
  186. //                                FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
  187. //
  188. //  @rdesc  Returns a DWORD which will be passed to Read, Write, etc or NULL if
  189. //          unable to open device.
  190. //
  191. // -----------------------------------------------------------------------------
  192. extern "C" PDWORD DEMO_Open( DWORD dwData,
  193.                            DWORD dwAccess,
  194.                            DWORD dwShareMode);
  195. // -----------------------------------------------------------------------------
  196. //
  197. //  @doc    WDEV_EXT
  198. //
  199. //  @func   BOOL | DEMO_Close | Device close routine
  200. //
  201. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  202. //
  203. //  @rdesc  Returns TRUE for success, FALSE for failure
  204. //
  205. // -----------------------------------------------------------------------------
  206. //extern "C" BOOL DEMO_Close(PDWORD pdwData);
  207. // -----------------------------------------------------------------------------
  208. //
  209. //  @doc    WDEV_EXT
  210. //
  211. //  @func   DWORD | DEMO_Read | Device read routine
  212. //
  213. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  214. //
  215. //  @parm   LPVOID | pBuf | Buffer to receive data (ignored)
  216. //
  217. //  @parm   DWORD | len | Maximum length to read (ignored)
  218. //
  219. //  @rdesc  Returns 0 always. DEMO_Read should never get called and does
  220. //          nothing. Required DEVICE.EXE function, but all data communication
  221. //          is handled by <f DEMO_IOControl>.
  222. //
  223. // -----------------------------------------------------------------------------
  224. extern "C" DWORD DEMO_Read(DWORD dwData,
  225.                           LPVOID pBuf,
  226.                           DWORD Len);
  227. // -----------------------------------------------------------------------------
  228. //
  229. //  @doc    WDEV_EXT
  230. //
  231. //  @func   DWORD | DEMO_Write | Device write routine
  232. //
  233. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  234. //
  235. //  @parm   LPCVOID | pBuf | Buffer containing data (ignored)
  236. //
  237. //  @parm   DWORD | len | Maximum length to write (ignored)
  238. //
  239. //  @rdesc  Returns 0 always. DEMO_Write should never get called and does
  240. //          nothing. Required DEVICE.EXE function, but all data communication
  241. //          is handled by <f DEMO_IOControl>.
  242. //
  243. // -----------------------------------------------------------------------------
  244. extern "C" DWORD DEMO_Write(DWORD dwData,
  245.                            LPCVOID pBuf,
  246.                            DWORD Len);
  247. // -----------------------------------------------------------------------------
  248. //
  249. //  @doc    WDEV_EXT
  250. //
  251. //  @func   DWORD | DEMO_Seek | Device seek routine
  252. //
  253. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  254. //
  255. //  @parm   long | pos | Position to seek to (relative to type) (ignored)
  256. //
  257. //  @parm   DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
  258. //
  259. //  @rdesc  Returns -1 always. DEMO_Seek should never get called and does
  260. //          nothing. Required DEVICE.EXE function, but all data communication
  261. //          is handled by <f DEMO_IOControl>.
  262. //
  263. // -----------------------------------------------------------------------------
  264. extern "C" DWORD DEMO_Seek(DWORD dwData,
  265.                           long pos,
  266.                           DWORD type);
  267. // -----------------------------------------------------------------------------
  268. //
  269. //  @doc    WDEV_EXT
  270. //
  271. //  @func   void | DEMO_PowerUp | Device powerup routine
  272. //
  273. //  @comm   Called to restore device from suspend mode.  Cannot call any
  274. //          routines aside from those in the dll in this call.
  275. //
  276. // -----------------------------------------------------------------------------
  277. extern "C" VOID DEMO_PowerUp(VOID);
  278. // -----------------------------------------------------------------------------
  279. //
  280. //  @doc    WDEV_EXT
  281. //
  282. //  @func   void | DEMO_PowerDown | Device powerdown routine
  283. //
  284. //  @comm   Called to suspend device.  Cannot call any routines aside from
  285. //          those in the dll in this call.
  286. //
  287. // -----------------------------------------------------------------------------
  288. //extern "C" VOID DEMO_PowerDown(VOID);
  289. // -----------------------------------------------------------------------------
  290. //
  291. //  @doc    WDEV_EXT
  292. //
  293. //  @func   BOOL | DEMO_IOControl | Device IO control routine
  294. //
  295. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  296. //
  297. //  @parm   DWORD | dwCode |
  298. //          IO control code for the function to be performed. DEMO_IOControl only
  299. //          supports one IOCTL value (IOCTL_DEMO_MESSAGE)
  300. //
  301. //  @parm   PBYTE | pBufIn |
  302. //          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
  303. //
  304. //  @parm   DWORD | dwLenIn |
  305. //          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
  306. //
  307. //  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
  308. //
  309. //  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
  310. //
  311. //  @parm   PDWORD | pdwActualOut | Unused
  312. //
  313. //  @rdesc  Returns TRUE for success, FALSE for failure
  314. //
  315. //  @xref   <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
  316. //          <t DEMOe Output Driver Messages> (WODM_XXX)
  317. //
  318. // -----------------------------------------------------------------------------
  319. extern "C" BOOL DEMO_IOControl(PDWORD  pdwOpenData,
  320.                               DWORD  dwCode,
  321.                               PBYTE  pBufIn,
  322.                               DWORD  dwLenIn,
  323.                               PBYTE  pBufOut,
  324.                               DWORD  dwLenOut,
  325.                               PDWORD pdwActualOut);
  326. #endif
以上为头文件部分

  1. // Copyright Mercury's CO.,LTD.2007-2008
  2. // Author : Mercury Xu
  3. // Descript: this file for DEMO chip,it's a dll entry function 
  4. // in this file include the DEMO_XXX function for driver the chip
  5. // as a stream device.At the same time,in the bsp package we define
  6. // other function for make suer that this device can reset.use 
  7. // centrality define function from gGPIO.h head file.
  8. //update log
  9. //create by : 2008-03-21 mercury xu 
  10. //modify  : 2008-04-01 mercury xu add little functions segment.as following
  11. //modify  : 2008-04-01 mercury xu modify the operation functions.
  12. //add       :2008-04-03 mercury xu add some functions and some define
  13. //modify  : 2008-07-30 mercury xu change basic drvier to screen driver
  14. /
  15. #include <drvlib.h>
  16. #include <oal_at4x0a.h>
  17. #include <cspregs.h>
  18. #include <nkintr.h>
  19. #include "halio.h"
  20. #include "uhal.h"
  21. #include "drvglob.h"
  22. #include "DEMO.h"
  23. /
  24. //=============================================================================
  25. //Title : WrToDEMO
  26. //Detail: Write Data To DEMO
  27. //Input : addr data
  28. //Output: none
  29. //Author: Mercury Xu
  30. //Data  : 2008-07-30
  31. //=============================================================================
  32. void WrToDEMO(unsigned char addr,unsigned char data)
  33. {
  34.         StartBit();
  35.     RETAILMSG(1,(TEXT("WRITE DEMO address/r/n")));
  36.          
  37.         WrData(DEMO_WriteID);
  38.         if  ( !ReceiveAck() ) //continue;
  39.         
  40.             {
  41.             
  42.     RETAILMSG(1,(TEXT("WRITE DEMO address/r/n")));
  43.     
  44.         WrData(addr);
  45.         
  46.             }
  47.         
  48.         if  ( !ReceiveAck() )// continue;
  49.         
  50.             {
  51.             
  52.     RETAILMSG(1,(TEXT("WRITE DEMO data/r/n")));
  53.         WrData(data);
  54.             }
  55.         
  56.         if  ( !ReceiveAck() )// continue;
  57.         
  58.             {
  59.             
  60.     RETAILMSG(1,(TEXT("Stop!/r/n")));
  61.         StopBit();
  62.         }
  63. }
  64. //=============================================================================
  65. //Title : initial_DEMO
  66. //Detail: initial DEMO chip
  67. //Input : none
  68. //Output: none
  69. //Author: Mercury Xu
  70. //Data  : 2008-07-30
  71. //=============================================================================
  72. void initial_DEMO()
  73. {
  74.      int i; 
  75.      unsigned char  address=0x00;
  76.      unsigned char error_ind;
  77.      unsigned char DEMO_reg_data[98] = {};
  78.      unsigned char DEMOdata;
  79.      int loop_counter = 0;
  80.     //DEMO_reset();
  81.     /*
  82.     for(i=0; i<50; i++)      
  83.     {
  84.         if(OperationDEMO(WRITE,&DEMOAddress[i] , 1))
  85.         RETAILMSG(1,(TEXT("address write ok!/r/n")));
  86.     
  87.         if(OperationDEMO(WRITE,&DEMOTable[i] , 1))
  88.             RETAILMSG(1,(TEXT("data write ok!/r/n")));
  89.     }
  90.      */
  91.         for(i=0; i<50; i++)      
  92.        {
  93.         DEMOdata = DEMOTable[i];
  94.         address = DEMOAddress[i];
  95.         
  96.         WrToDEMO(address,DEMOdata);
  97.        }
  98.     RETAILMSG(1,(TEXT("DEMO_Read!/r/n ")));
  99.     do
  100.     {   
  101.         error_ind = OperationDEMO(READ, &(DEMO_reg_data[loop_counter]), 1);
  102.         if(error_ind)
  103.             {
  104.             RETAILMSG(1,(TEXT("power up cts error!/r/n")));
  105.             //return  (FALSE);
  106.             }
  107.         RETAILMSG(1,(TEXT("return val =%d/r/n"),DEMO_reg_data[loop_counter]));
  108.         loop_counter++;
  109.     }
  110.     while(((DEMO_reg_data[0]) != 0x80) && (loop_counter < 0x62));  //loop_counter limit should guarantee at least 300us
  111.     
  112.     if(loop_counter >= 0x62)
  113.     {
  114.         RETAILMSG(1,(TEXT("out...this chip couldn't read any things!!!!/r/n")));
  115.         
  116.     
  117.     }
  118.     else
  119.     {
  120.         RETAILMSG(1,(TEXT("everything is normal....future is beatuiful...!/r/n ")));
  121.     }
  122.     
  123. }
  124. //=============================================================================
  125. //Title : ReceiveAck
  126. //Detail: Receive Ack from DEMO chip
  127. //Input : none
  128. //Output: int
  129. //Author: Mercury Xu
  130. //Data  : 2008-07-30
  131. //=============================================================================
  132. int ReceiveAck()
  133. {
  134.    
  135.     int val;
  136.     
  137.     sdio_input_enable();
  138.     sclk_high();
  139.        sleepGPIO(100);
  140.     val = sdio_getdata();
  141.     RETAILMSG(1,(TEXT("return val =%d/r/n"),val));
  142.     sclk_low();
  143.     sdio_output_enable();
  144.      sdio_low();
  145.      sleepGPIO(500);
  146.      
  147.      return (val);
  148.       
  149. }
  150. //=============================================================================
  151. //Title : StopBit
  152. //Detail: StopBit  from DEMO chip
  153. //Input : none
  154. //Output: none
  155. //Author: Mercury Xu
  156. //Data  : 2008-07-30
  157. //=============================================================================
  158. void StopBit()
  159. {
  160.  
  161.        sdio_high();
  162.        sleepGPIO(500);
  163.     sclk_high();
  164. }
  165. //=============================================================================
  166. //Title : StartBit
  167. //Detail: StartBit  from DEMO chip
  168. //Input : none
  169. //Output: none
  170. //Author: Mercury Xu
  171. //Data  : 2008-07-30
  172. //=============================================================================
  173. void StartBit()
  174. {
  175.     
  176.     
  177.      sdio_low();
  178.      sleepGPIO(500);
  179.      sclk_low();
  180. }
  181. //=============================================================================
  182. //Title : WrData
  183. //Detail: WrData to DEMO chip
  184. //Input : none
  185. //Output: none
  186. //Author: Mercury Xu
  187. //Data  : 2008-07-30
  188. //=============================================================================
  189. void WrData(unsigned char data)
  190. {
  191.     int i; 
  192.     for (i=0; i<8; i++)
  193.     {
  194.         if (data & 0x80)
  195.             sdio_high();
  196.         else
  197.             sdio_low();
  198.         sleepGPIO(500);
  199.  
  200.         sclk_high();
  201.         
  202.         data = (data<<1);
  203.         
  204.         sleepGPIO(500);
  205.         sclk_low();
  206.     }
  207. //  sleepGPIO(5);
  208.  
  209. }
  210. //
  211. /*
  212. void DEMO_reset()
  213. {
  214. RETAILMSG(1,(TEXT(" DEMO reset begin")));//add by mercury xu Mercury's 20080909
  215. GPIO_OUTPUT_ZERO (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  216. GPIO_OUTPUT_ENABLE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  217.     sleepGPIO(10);
  218.     
  219. GPIO_OUTPUT_ONE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  220.     
  221. GPIO_OUTPUT_ENABLE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  222. RETAILMSG(1,(TEXT(" DEMO reset end")));//add by mercury xu Mercury's 20080909
  223. //DEMO RESET
  224. }
  225. */
  226. ///
  227. //modify by mercury xu  Mercury's 20080401
  228. //this segment for define some useful little function.usually use in the program.
  229. //there are including some functions as following words
  230. //sdio_high()
  231. //sdio_low()
  232. //sclk_high()
  233. //sclk_low()
  234. //sdio_output_enable()
  235. //sdio_input_enable()
  236. //sdio_getdata()
  237. ///
  238. //update log
  239. //create by mercury xu  20070401
  240. ///
  241. void sleepGPIO(long usVal)
  242. {
  243.     DWORD StartLo, StartHi, TickCnt;
  244.     if (usVal != 0)
  245.     
  246.     {   
  247.     
  248.         // Calculate the match tick count first, automatically cut the overflow part of result.
  249.         TickCnt = usVal * TIMERTICK;
  250.         if (TickCnt == MAXDWORD)
  251.         {
  252.             DEBUGMSG(1, (TEXT("ERROR: usWait(usVal) input parameter usVal:0x%x too big!!!"), usVal));
  253.             return;
  254.         }
  255.         v_pOSTRegs->ostlatch = 1;
  256.         StartLo = v_pOSTRegs->ostlatchlo;
  257.         StartHi = v_pOSTRegs->ostlatchhi;
  258.         do 
  259.         {
  260.             v_pOSTRegs->ostlatch = 1;
  261.         }while ((v_pOSTRegs->ostlatchhi-StartHi)?((DWORD)(MAXDWORD-StartLo + v_pOSTRegs->ostlatchlo) < TickCnt):((DWORD)(v_pOSTRegs->ostlatchlo - StartLo) < TickCnt));
  262.     
  263.     }
  264.     //end if
  265. }
  266. ///
  267. void sdio_high()
  268. {
  269.     
  270.     GPIO_OUTPUT_ONE ();
  271.     
  272.     GPIO_OUTPUT_ENABLE ();    
  273.     
  274.     //modify by mercury for cnd620F 20080730 change the control to i2c
  275. }
  276. ///
  277. void sdio_low()
  278. {
  279.     
  280.     GPIO_OUTPUT_ZERO ();
  281.     
  282.     GPIO_OUTPUT_ENABLE ();
  283.     
  284.     //modify by mercury for cnd620F 20080730 change the control to i2c
  285. }
  286. ///
  287. void sclk_high()
  288. {
  289.     
  290.     GPIO_OUTPUT_ONE ();
  291.     
  292.     GPIO_OUTPUT_ENABLE ();
  293.     
  294.     //modify by mercury for cnd620F 20080730 change the control to i2c
  295. }
  296. ///
  297. void sclk_low()
  298. {
  299.     
  300.     GPIO_OUTPUT_ZERO ();
  301.     
  302.     GPIO_OUTPUT_ENABLE ();
  303.     
  304.     //modify by mercury for cnd620F 20080730 change the control to i2c
  305. }
  306. //
  307. void sdio_output_enable()
  308. {
  309.     
  310.     GPIO_OUTPUT_ENABLE (); 
  311.     
  312.     //modify by mercury for cnd620F 20080730 change the control to i2c
  313. }
  314. //
  315. void sdio_input_enable()
  316. {
  317.     
  318.     GPIO_OUTPUT_DISABLE(); 
  319.     
  320.     GPIO_INT_ENABLE(); 
  321.     
  322.     //modify by mercury for cnd620F 20080730 change the control to i2c   
  323. }
  324. //
  325. int sdio_getdata()
  326. {
  327.     
  328.     GPIO_OUTPUT_DISABLE ();
  329.     GPIO_INT_ENABLE();
  330.     
  331.     sleepGPIO(2000);
  332.     
  333.     return (GPIO_READ_INPUT ());
  334.     
  335.     //modify by mercury for cnd620F 20080730 change the control to i2c
  336. }
  337. //end segment
  338. //
  339. // si4730_reset
  340. // this function use to make sure the chip reset when we use it first.
  341. // step like follow descript:
  342. // sdio low->reset low->sclk high->delay->reset high->delay->sdio high->delay
  343. //
  344. //update log 
  345. //2008-03-29 add by mercury xu Mercury's for chip si4730 reset
  346. //
  347. void sdio_reset()
  348. {
  349.     sdio_low();
  350.     GPIO_OUTPUT_ZERO ();
  351.     GPIO_OUTPUT_ENABLE ();
  352.     
  353.     //modify by mercury for cnd620F 20080730 change the control to i2c
  354.     sclk_high();
  355.     
  356.     sleepGPIO(1000);
  357.     
  358.     GPIO_OUTPUT_ONE ();
  359.     
  360.     GPIO_OUTPUT_ENABLE ();
  361.     sleepGPIO(1000);
  362.     
  363.     sdio_high();
  364.     
  365.     sleepGPIO(1000);
  366. }
  367. //end segment
  368. ///
  369. /
  370. //modify by mercury xu ,add a function for si4730,this function use to operation this chip
  371. //make sure the chip reset,and then,set a command power it up ,if this function can sent 
  372. //command to chip,there will be make out some noises just like radio couldn't get any 
  373. //programs,that means this chip can work.all the applcation use in the application .exe
  374. //Mercury's for car v600 2008-03-27 
  375. //this segment "as is" silicon lab's function.
  376. //Mercury's co,.ltd.
  377. /
  378. extern "C" unsigned char OperationDEMO(T_OPERA_MODE operation, unsigned char *data, unsigned char numBytes)
  379. {
  380. //define some variables for this function
  381. unsigned char controlword;
  382.     unsigned char j;
  383.     unsigned error;
  384.     int i;
  385.     int testNo;
  386.     int testNo1;
  387.     int returndata;
  388.     controlword = 0;
  389.     j = 0;
  390.     error = 0;
  391.     i = 0;
  392.     testNo = 0;
  393.        testNo1 = 0;
  394.     returndata = 0;
  395. //define variable end
  396. //function begin
  397. /***************************************************
  398. START: make sure here SDIO_DIR =OUT, SCLK = 1,  SDIO = 1
  399. ****************************************************/
  400.        
  401.     sdio_low();
  402.     sleepGPIO(500);
  403.     sclk_low();
  404.     sleepGPIO(500);
  405.     RETAILMSG(1,(TEXT("I2C START!/r/n ")));
  406. /***************************************************
  407. WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0
  408. ****************************************************/
  409.     if(operation == READ)
  410.     {
  411.         RETAILMSG(1,(TEXT("0x49 READ!/r/n ")));
  412.         controlword = 0x4A;
  413.         
  414.     }
  415.     else 
  416.     {
  417.         RETAILMSG(1,(TEXT("0x48 WRITE!/r/n ")));
  418.         controlword = 0x4B;
  419.         
  420.     }
  421.     RETAILMSG(3,(TEXT("Write IIC ADDR:  0x%x/r/n"),controlword));
  422.     for(i = 7; i>=0; i--)
  423.     {
  424.         if((controlword >> i) & 0x01)
  425.             
  426.             sdio_high();
  427.         else
  428.             sdio_low();
  429.     
  430.             sleepGPIO(500);
  431.         
  432.             sclk_high();
  433.         
  434.             sleepGPIO(500);
  435.         
  436.             sclk_low();
  437.         
  438.             sleepGPIO(500);
  439.     }
  440.     
  441. /***************************
  442. CHECK ACK for control word
  443. ***************************/
  444.      sdio_input_enable();
  445.     
  446.      sleepGPIO(500);
  447.      sclk_high();
  448.      sleepGPIO(500);
  449.     if(( returndata = sdio_getdata())!= 0)//READ_SDIO
  450.     {
  451.         error = 1;
  452.         
  453.         RETAILMSG(1,(TEXT("Write add ack error!/r/n ")));
  454.         
  455.         RETAILMSG(3,(TEXT("returndata:  %d/r/n"),returndata));
  456.           
  457.         goto STOP;
  458.     }
  459.     RETAILMSG(1,(TEXT("Write add ack OK!/r/n ")));
  460.     sclk_low();
  461.     sleepGPIO(500);
  462. /***************************************
  463. WRITE or READ data
  464. ****************************************/
  465. if(operation == READ)
  466.             RETAILMSG(3,(TEXT("read data show:  ")));
  467.     else
  468.         RETAILMSG(3,(TEXT("write data show:  ")));
  469.     
  470.     for(j = 0; j < numBytes; j++, data++)
  471.     {
  472.         if(operation == WRITE)
  473.             sdio_output_enable();
  474.         else
  475.             sdio_input_enable();
  476.         for(i = 7; i>=0; i--)
  477.         {
  478.             if(operation == WRITE)
  479.                 if((*data >> i) & 0x01)
  480.                     sdio_high();
  481.                 else
  482.                     sdio_low();
  483.                     sleepGPIO(50);
  484.                     sclk_high();
  485.                     sleepGPIO(50);
  486.               if(operation == READ)
  487.                 *data = ((*data << 1) | (sdio_getdata()));//READ_SDIO
  488.               sclk_low();
  489.               sleepGPIO(50);
  490.         }
  491.         
  492.             if(operation == READ)
  493.             RETAILMSG(3,(TEXT("  0x%x"),*data));
  494.         else
  495.             RETAILMSG(3,(TEXT("  0x%x"),*data));
  496.         //modify at 20080331
  497. /******************************
  498. CHECK ACK or SEND ACK=0
  499. *******************************/
  500.         if(operation == WRITE)
  501.             sdio_input_enable();
  502.         else
  503.         {
  504.             sdio_output_enable();
  505.             if(j == (numBytes - 1))
  506.                 sdio_high();
  507.             else
  508.                 sdio_high();
  509.         }
  510.         sleepGPIO(50);
  511.         sclk_high();
  512.         sleepGPIO(50);
  513.         if(operation == WRITE)
  514.             if((sdio_getdata())!= 0)//READ_SDIO
  515.             {
  516.                  RETAILMSG(1,(TEXT("  ACK ERROR,Quit!/r/n")));
  517.                 error = 1;
  518.                 goto STOP;
  519.             }
  520.             RETAILMSG(1,(TEXT("  ACK OK")));
  521.             sclk_low();
  522.             sleepGPIO(50);
  523.         }
  524.     
  525. /****************************
  526. STOP: make sure here: SCLK = 0
  527. *****************************/
  528.     STOP:
  529.     sdio_output_enable();
  530.     sdio_low();
  531.     sleepGPIO(50);
  532.     sclk_high();
  533.     sleepGPIO(50);
  534.     sdio_high();
  535.     return(error);
  536. //function end
  537. }
  538. ///
  539. //------------------------------------------------------------------------------
  540. // @xref                          <nl>
  541. //          <f DEMO_Init>,         <nl>
  542. //          <f DEMO_Deinit>,       <nl>
  543. //          <f DEMO_Open>,         <nl>
  544. //          <f DEMO_Close>,        <nl>
  545. //          <f DEMO_Read>,         <nl>
  546. //          <f DEMO_Write>,        <nl>
  547. //          <f DEMO_Seek>,         <nl>
  548. //          <f DEMO_PowerUp>,      <nl>
  549. //          <f DEMO_PowerDown>,    <nl>
  550. //          <f DEMO_IOControl>     <nl>
  551. //
  552. // -----------------------------------------------------------------------------
  553. /
  554. BOOL CALLBACK DllMain(HANDLE hDLL,
  555.                       DWORD dwReason,
  556.                       LPVOID lpvReserved)
  557. {
  558.     switch (dwReason) 
  559.     {
  560.     case DLL_PROCESS_ATTACH :
  561.         DEBUGREGISTER((HINSTANCE)hDLL);
  562.         DisableThreadLibraryCalls((HMODULE) hDLL);
  563.         break;
  564.     case DLL_PROCESS_DETACH :
  565.         break;
  566.     case DLL_THREAD_DETACH :
  567.         break;
  568.     case DLL_THREAD_ATTACH :
  569.         break;
  570.     default :
  571.         break;
  572.     }
  573.     //end switch
  574.     return TRUE;
  575. }
  576. extern "C" DWORD DEMO_Init(DWORD Index)
  577. {
  578.     RETAILMSG(1,(TEXT("DEMO_Init!/r/n ")));
  579.        //DEMO_reset();
  580.    
  581.        // initial_DEMO();
  582.        
  583.     return TRUE;
  584. }
  585. // -----------------------------------------------------------------------------
  586. //
  587. //  @doc    WDEV_EXT
  588. //
  589. //  @func   PVOID | DEMO_Deinit | Device deinitialization routine
  590. //
  591. //  @parm   DWORD | dwData | value returned from DEMO_Init call
  592. //
  593. //  @rdesc  Returns TRUE for success, FALSE for failure.
  594. //
  595. // -----------------------------------------------------------------------------
  596. extern "C" BOOL DEMO_Deinit(DWORD dwData)
  597. {
  598.     RETAILMSG(1,(TEXT("DEMO_DeInit!/r/n ")));
  599.     return TRUE;
  600. }
  601. // -----------------------------------------------------------------------------
  602. //
  603. //  @doc    WDEV_EXT
  604. //
  605. //  @func   PVOID | DEMO_Open    | Device open routine
  606. //
  607. //  @parm   DWORD | dwData      | Value returned from DEMO_Init call (ignored)
  608. //
  609. //  @parm   DWORD | dwAccess    | Requested access (combination of GENERIC_READ
  610. //                                and GENERIC_WRITE) (ignored)
  611. //
  612. //  @parm   DWORD | dwShareMode | Requested share mode (combination of
  613. //                                FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
  614. //
  615. //  @rdesc  Returns a DWORD which will be passed to Read, Write, etc or NULL if
  616. //          unable to open device.
  617. //
  618. // -----------------------------------------------------------------------------
  619. extern "C" PDWORD DEMO_Open( DWORD dwData,
  620.                            DWORD dwAccess,
  621.                            DWORD dwShareMode)
  622. {
  623.     RETAILMSG(1,(TEXT("DEMO_OPEN /r/ndwData=%d;AccessCode=%d /r/n"),dwData, dwAccess));
  624.      initial_DEMO();
  625.    
  626.     return (PDWORD)TRUE;
  627.     //modify by mercury xu Mercury's 2008-04-04
  628. }
  629. // -----------------------------------------------------------------------------
  630. //
  631. //  @doc    WDEV_EXT
  632. //
  633. //  @func   BOOL | DEMO_Close | Device close routine
  634. //
  635. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  636. //
  637. //  @rdesc  Returns TRUE for success, FALSE for failure
  638. //
  639. // -----------------------------------------------------------------------------
  640. extern "C" BOOL DEMO_Close(PDWORD pdwData)
  641. {
  642.     return(FALSE);
  643. }
  644. // -----------------------------------------------------------------------------
  645. //
  646. //  @doc    WDEV_EXT
  647. //
  648. //  @func   DWORD | DEMO_Read | Device read routine
  649. //
  650. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  651. //
  652. //  @parm   LPVOID | pBuf | Buffer to receive data (ignored)
  653. //
  654. //  @parm   DWORD | len | Maximum length to read (ignored)
  655. //
  656. //  @rdesc  Returns 0 always. DEMO_Read should never get called and does
  657. //          nothing. Required DEVICE.EXE function, but all data communication
  658. //          is handled by <f DEMO_IOControl>.
  659. //
  660. // -----------------------------------------------------------------------------
  661. extern "C" DWORD DEMO_Read(DWORD dwData,
  662.                           LPVOID pBuf,
  663.                           DWORD Len)
  664. {
  665.     return  (FALSE);
  666.     
  667. }
  668. // -----------------------------------------------------------------------------
  669. //
  670. //  @doc    WDEV_EXT
  671. //
  672. //  @func   DWORD | DEMO_Write | Device write routine
  673. //
  674. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  675. //
  676. //  @parm   LPCVOID | pBuf | Buffer containing data (ignored)
  677. //
  678. //  @parm   DWORD | len | Maximum length to write (ignored)
  679. //
  680. //  @rdesc  Returns 0 always. DEMO_Write should never get called and does
  681. //          nothing. Required DEVICE.EXE function, but all data communication
  682. //          is handled by <f DEMO_IOControl>.
  683. //
  684. // -----------------------------------------------------------------------------
  685. extern "C" DWORD DEMO_Write(DWORD dwData,
  686.                            LPCVOID pBuf,
  687.                            DWORD Len)
  688. {      
  689.     unsigned short temp;
  690.     temp = *(unsigned short *) pBuf;
  691.     RETAILMSG(1,(TEXT("DEMO_write!/r/n ")));
  692.     return(TRUE);
  693.     
  694. }
  695. // -----------------------------------------------------------------------------
  696. //
  697. //  @doc    WDEV_EXT
  698. //
  699. //  @func   DWORD | DEMO_Seek | Device seek routine
  700. //
  701. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  702. //
  703. //  @parm   long | pos | Position to seek to (relative to type) (ignored)
  704. //
  705. //  @parm   DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
  706. //
  707. //  @rdesc  Returns -1 always. DEMO_Seek should never get called and does
  708. //          nothing. Required DEVICE.EXE function, but all data communication
  709. //          is handled by <f DEMO_IOControl>.
  710. //
  711. // -----------------------------------------------------------------------------
  712. extern "C" DWORD DEMO_Seek(DWORD dwData,
  713.                           long pos,
  714.                           DWORD type)
  715. {
  716.     RETAILMSG(1,(TEXT("DEMO_Seek!/r/n ")));
  717.     return(TRUE);
  718.     //return((DWORD)DEMO_FM_Tune_DEMO());
  719. }
  720. // -----------------------------------------------------------------------------
  721. //
  722. //  @doc    WDEV_EXT
  723. //
  724. //  @func   void | DEMO_PowerUp | Device powerup routine
  725. //
  726. //  @comm   Called to restore device from suspend mode.  Cannot call any
  727. //          routines aside from those in the dll in this call.
  728. //
  729. // -----------------------------------------------------------------------------
  730. extern "C" VOID DEMO_PowerUp(VOID)
  731. {
  732.     //DEMO_reset();
  733.     RETAILMSG(1,(TEXT("DEMO_PowerUp!/r/n ")));
  734. //  sleepGPIO(800);
  735. }
  736. // -----------------------------------------------------------------------------
  737. //
  738. //  @doc    WDEV_EXT
  739. //
  740. //  @func   void | DEMO_PowerDown | Device powerdown routine
  741. //
  742. //  @comm   Called to suspend device.  Cannot call any routines aside from
  743. //          those in the dll in this call.
  744. //
  745. // -----------------------------------------------------------------------------
  746. extern "C" VOID DEMO_PowerDown(VOID)
  747. {
  748.     RETAILMSG(1,(TEXT("DEMO_PowerDown!/r/n ")));
  749. }
  750. // -----------------------------------------------------------------------------
  751. //
  752. //  @doc    WDEV_EXT
  753. //
  754. //  @func   BOOL | DEMO_IOControl | Device IO control routine
  755. //
  756. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  757. //
  758. //  @parm   DWORD | dwCode |
  759. //          IO control code for the function to be performed. DEMO_IOControl only
  760. //          supports one IOCTL value (IOCTL_DEMO_MESSAGE)
  761. //
  762. //  @parm   PBYTE | pBufIn |
  763. //          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
  764. //
  765. //  @parm   DWORD | dwLenIn |
  766. //          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
  767. //
  768. //  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
  769. //
  770. //  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
  771. //
  772. //  @parm   PDWORD | pdwActualOut | Unused
  773. //
  774. //  @rdesc  Returns TRUE for success, FALSE for failure
  775. //
  776. //  @xref   <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
  777. //          <t DEMOe Output Driver Messages> (WODM_XXX)
  778. //
  779. // -----------------------------------------------------------------------------
  780. extern "C"  BOOL DEMO_IOControl(PDWORD  pdwOpenData,
  781.                                DWORD  dwCode,
  782.                                PBYTE  pBufIn,
  783.                                DWORD  dwLenIn,
  784.                                PBYTE  pBufOut,
  785.                                DWORD  dwLenOut,
  786.                                PDWORD pdwActualOut)
  787. {
  788.     RETAILMSG(1,(TEXT("DEMO/r/n  pdwOpenData=%d;dwCode=%d/r/n"),pdwOpenData,dwCode));
  789.     
  790.     return(FALSE);
  791. }

以上部分为Cpp部分。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值