微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440IIC中断方式

S3C2440IIC中断方式

时间: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);//设置系统时钟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,使能中断,发送时钟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("WritetestdataintoAT24C02\n");
  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("ReadtestdatafromAT24C02\n");
  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;//主发模式,产生起始信号,使能Rx/Tx
  52. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  53. while(flag==1)//等待发送完成
  54. Delay(1);
  55. flag=1;
  56. rIICDS=addr;//写入存储字节的地址到数据移位寄存器
  57. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  58. while(flag==1)//等待发送完成
  59. Delay(1);
  60. flag=1;
  61. rIICDS=data;//把要发送的数据写入数据移位寄存器
  62. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  63. while(flag==1)//等待发送完成
  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;//主发模式,产生起始信号,使能Rx/Tx
  75. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  76. while(flag==1)//等待发送完成
  77. Delay(1);
  78. flag=1;
  79. rIICDS=addr;//写入存储字节的地址到数据移位寄存器
  80. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  81. while(flag==1)//等待发送完成
  82. Delay(1);
  83. flag=1;
  84. rIICDS=slvAddr;
  85. rIICSTAT=0xb0;//主接收模式,使能Rx/Tx
  86. rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
  87. while(flag==1)//等待发送完成
  88. Delay(1);
  89. //注意:读取下面这个字节必须进行,因为在发送带有读命令的从设备地址后,
  90. //AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以
  91. //一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;
  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. }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top