IB_Reader.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "IB_Reader.h"
  2. #include "gpio.h"
  3. #define IB_READ_ROM (0x33)
  4. #define IB_MATCH_ROM (0x55)
  5. #define IB_SEARCH_ROM (0xF0)
  6. #define IB_SKIP_ROM (0x33)
  7. #define IB_WRITE_SCRATCHPAD (0x0F)
  8. #define IB_READ_SCRATCHPAD (0xAA)
  9. #define IB_COPY_SCRATCHPAD (0x55)
  10. #define IB_READ_MEMORY (0xF0)
  11. static uint8_t rom_id[8]={0};
  12. /**
  13. * @brief 初始化
  14. * @param 无
  15. * @retval ACK应答位
  16. **/
  17. uint8_t OneWire_Init()
  18. {
  19. uint8_t Ackbit = 0;
  20. IBTX_WIRE_HIGH; //先将总线拉高
  21. IBTX_WIRE_LOW; //然后将总线拉低
  22. udelay(500);
  23. IBTX_WIRE_HIGH; //释放总线
  24. udelay(70); //Delay 70 us
  25. Ackbit=IBRX_WIRE_BIT; //读取应答位
  26. udelay(500); //Delay 500 us
  27. return Ackbit;
  28. }
  29. /**
  30. * @brief 发送一位
  31. * @param Bit
  32. * @retval 无
  33. **/
  34. void OneWire_Senbit(uint8_t Bit)
  35. {
  36. IBTX_WIRE_LOW; //拉低
  37. udelay(5); //Delay 10 us(考虑到调用函数需要时间,实际i可以适当取的更大)
  38. //发送一位
  39. if(0 == Bit){
  40. IBTX_WIRE_LOW;
  41. }else{
  42. IBTX_WIRE_HIGH;
  43. }
  44. //讲解:从发送0和发送1俩个不同的时序可以看出,如果我们在10us的时候将Bit放在DQ上,如果是0
  45. // 则DQ一直会被拉低,如果是1,主机也会将DQ拉高,最后等50us后将数据发送即可
  46. udelay(45); //Delay 50 us
  47. IBTX_WIRE_HIGH; //拉高,便于下次发送
  48. }
  49. /**
  50. * @brief 接受一位
  51. * @param 无
  52. * @retval Bit
  53. **/
  54. uint8_t OneWire_ReceiveBit()
  55. {
  56. uint8_t Bit;
  57. IBTX_WIRE_LOW;
  58. udelay(3); //Delay 5 us
  59. IBTX_WIRE_HIGH;
  60. udelay(5); //Delay 5 us
  61. //解释:读取数据需要在15us内进行(贴近15us的时候),如果是0,DQ会在5us后被从机拉低,
  62. // 如果是1, DQ会在5us后被从机拉高
  63. Bit=IBRX_WIRE_BIT; //进行数据接受
  64. udelay(50); //Delay 50 us
  65. return Bit;
  66. }
  67. /**
  68. * @brief 发送一个字节
  69. * @param Byte
  70. * @retval 无
  71. **/
  72. void OneWire_SenByte(uint8_t Byte)
  73. {
  74. uint8_t i;
  75. for(i=0;i<8;i++)
  76. {
  77. OneWire_Senbit(Byte&(0x01<<i));//低位在前
  78. }
  79. }
  80. /**
  81. * @brief 接受一个字节
  82. * @param 无
  83. * @retval Byte
  84. **/
  85. uint8_t OneWire_ReceiveByte()
  86. {
  87. uint8_t i;
  88. uint8_t Byte=0x00;
  89. for(i=0;i<8;i++)
  90. {
  91. if(OneWire_ReceiveBit()){Byte|=(0x01<<i);} //低位在前
  92. }
  93. return Byte;
  94. }
  95. uint8_t IBread_OilType(void)
  96. {
  97. return 0;
  98. }
  99. uint8_t IBread_ROMID(void)
  100. {
  101. uint8_t Ackbit = 0;
  102. uint8_t i=0;
  103. Ackbit = OneWire_Init(); //总线初始化时序
  104. OneWire_SenByte(IB_READ_ROM); //发送读ROMID指令
  105. for(i=0; i<8;i++){
  106. rom_id[i]=OneWire_ReceiveByte(); //第一个字节为低位
  107. }
  108. return 0;
  109. }
  110. uint8_t IBread_Memory(void)
  111. {
  112. uint8_t Ackbit = 0;
  113. uint8_t i=0;
  114. Ackbit = OneWire_Init(); //总线初始化时序
  115. OneWire_SenByte(IB_SKIP_ROM);
  116. OneWire_SenByte(IB_READ_MEMORY);
  117. OneWire_SenByte(0x00);
  118. OneWire_SenByte(0x00);
  119. for(i=0; i<8;i++){
  120. rom_id[i]=OneWire_ReceiveByte(); //第一个字节为低位
  121. }
  122. return 0;
  123. }
  124. void IB_Print(void)
  125. {
  126. IBread_Memory();
  127. printf("memory:[%x][%x][%x][%x][%x][%x][%x][%x] \r\n", rom_id[0],rom_id[1],rom_id[2],rom_id[3],rom_id[4],rom_id[5],rom_id[6],rom_id[7]);
  128. }