新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > S3C2440IIC中斷方式

S3C2440IIC中斷方式

作者: 時間:2016-11-21 來源:網絡 收藏
  1. #include
  2. #include"2440addr.h"
  3. #include"2440lib.h"
  4. #include"Option.h"
  5. #include"def.h"
  6. intflag;//中斷標志(在中斷子程序里清零,即未中斷flag=1,中斷后flag=0)
  7. void__irqIicInt(void);
  8. voidWr24C02(U32slvAddr,U32addr,U8data);
  9. voidRd24C02(U32slvAddr,U32addr,U8*data);
  10. voidMain(void)
  11. {
  12. unsignedinti,j;
  13. staticU8data[256];//用于存儲AT24C02讀出的數據
  14. SelectFclk(2);//設置系統(tǒng)時鐘400M
  15. ChangeClockDivider(2,1);//設置分頻1:4:8
  16. CalcBusClk();//計算總線頻率
  17. rGPHCON&=~((3<<4)|(3<<6));
  18. rGPHCON|=(2<<4)|(2<<6);//GPH2--TXD[0];GPH3--RXD[0]
  19. rGPHUP=0x00;//使能上拉功能
  20. Uart_Init(0,115200);
  21. Uart_Select(0);
  22. Uart_Printf("[IICTest(Polling)usingAT24C020]n");
  23. rGPEUP|=0xc000;//關上拉
  24. rGPECON&=~0xf0000000;
  25. rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
  26. pISR_IIC=(unsigned)IicInt;//設置中斷程序地址
  27. rINTMSK&=~(BIT_IIC);//開中斷源
  28. //使能應答,IIC總線時鐘IICCLK=PCLK/16,使能中斷,發(fā)送時鐘IICCLK/16
  29. rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
  30. rIICADD=0x10;//2440從機地址=[7:1]
  31. rIICSTAT=0x10;//IIC總線數據輸出使能(Rx/Tx)
  32. Uart_Printf("WritetestdataintoAT24C02n");
  33. for(i=0;i<256;i++)
  34. Wr24C02(0xa0,(U8)i,i);//寫入數據到AT24C02
  35. for(i=0;i<256;i++)//數組數據清零
  36. data[i]=0;
  37. Uart_Printf("ReadtestdatafromAT24C02n");
  38. for(i=0;i<256;i++)
  39. Rd24C02(0xa0,(U8)i,&(data[i]));//讀取AT24C02的數據放入data數組中
  40. for(i=0;i<16;i++)
  41. {
  42. for(j=0;j<16;j++)
  43. Uart_Printf("%2x",data[i*16+j]);//打印從AT24C02讀出的數據
  44. Uart_Printf("n");
  45. }
  46. }
  47. voidWr24C02(U32slvAddr,U32addr,U8data)
  48. {
  49. flag=1;
  50. rIICDS=slvAddr;//從器件地址寫入數據移位寄存器
  51. rIICSTAT=0xf0;//主發(fā)模式,產生起始信號,使能Rx/Tx
  52. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  53. while(flag==1)//等待發(fā)送完成
  54. Delay(1);
  55. flag=1;
  56. rIICDS=addr;//寫入存儲字節(jié)的地址到數據移位寄存器
  57. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  58. while(flag==1)//等待發(fā)送完成
  59. Delay(1);
  60. flag=1;
  61. rIICDS=data;//把要發(fā)送的數據寫入數據移位寄存器
  62. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  63. while(flag==1)//等待發(fā)送完成
  64. Delay(1);
  65. rIICSTAT=0xd0;//禁止Rx/Tx
  66. rIICCON=0xaf;//ResumesIICoperation.
  67. Delay(1);
  68. }
  69. voidRd24C02(U32slvAddr,U32addr,U8*data)
  70. {
  71. U8temp;
  72. flag=1;
  73. rIICDS=slvAddr;//從器件地址寫入數據移位寄存器
  74. rIICSTAT=0xf0;//主發(fā)模式,產生起始信號,使能Rx/Tx
  75. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  76. while(flag==1)//等待發(fā)送完成
  77. Delay(1);
  78. flag=1;
  79. rIICDS=addr;//寫入存儲字節(jié)的地址到數據移位寄存器
  80. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  81. while(flag==1)//等待發(fā)送完成
  82. Delay(1);
  83. flag=1;
  84. rIICDS=slvAddr;
  85. rIICSTAT=0xb0;//主接收模式,使能Rx/Tx
  86. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  87. while(flag==1)//等待發(fā)送完成
  88. Delay(1);
  89. //注意:讀取下面這個字節(jié)必須進行,因為在發(fā)送帶有讀命令的從設備地址后,
  90. //AT24C02A會再返回一個從設備地址信息或從設備內存地址信息作為應答,所以
  91. //一定要把該字節(jié)讀取后拋棄,因為它不是我們所要讀取的信息;
  92. flag=1;
  93. temp=rIICDS;
  94. rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
  95. while(flag==1)
  96. Delay(1);
  97. rIICCON=0x2f;//ResumesIICoperation.禁止應答
  98. *data=rIICDS;
  99. Delay(1);
  100. rIICSTAT=0x90;//StopMasRxcondition
  101. rIICCON=0xaf;//ResumesIICoperation.
  102. Delay(1);//Waituntilstopcondtionisineffect.
  103. }
  104. void__irqIicInt(void)
  105. {
  106. ClearPending(BIT_IIC);
  107. flag=0;
  108. }


關鍵詞: S3C2440IIC中斷方

評論


技術專區(qū)

關閉