bus.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "bus.h"
  2. #include "timer.h"
  3. void file_produce(file_t* f, char x)
  4. {
  5. f->buffer[f->t]=x;
  6. f->t=(f->t+1)%1024;
  7. }
  8. char file_consume(file_t* f)
  9. {
  10. char x;
  11. while(f->t==f->q) micro_sleep(10);
  12. x=f->buffer[f->q];
  13. f->q=(f->q+1)%1024;
  14. return x;
  15. }
  16. int file_size(file_t* f)
  17. {
  18. return (f->t>=f->q)?f->t-f->q:1024-f->q+f->t;
  19. }
  20. void file_init(file_t* file)
  21. {
  22. file->t=file->q=0;
  23. }
  24. void bus_init_recv(bus_t* bus, int d, int clk, int ack)
  25. {
  26. bus->data=d;
  27. bus->clk=clk;
  28. bus->ack=ack;
  29. bus->ismaster=0;
  30. file_init(&bus->buffer);
  31. if (wiringPiSetup() == -1)
  32. {
  33. perror("Unable to setup wiring pi\n");
  34. exit (1);
  35. }else printf("WiringPi successfully setup\n");
  36. }
  37. void bus_init_send(bus_t* bus, int d, int clk, int ack)
  38. {
  39. bus->data=d;
  40. bus->clk=clk;
  41. bus->ack=ack;
  42. bus->ismaster=1;
  43. file_init(&bus->buffer);
  44. }
  45. void _bus_write(bus_t* bus, char x)
  46. {
  47. int i;
  48. unsigned long ref= time_micros();
  49. if(!bus->ismaster) return;
  50. for(i=0; i<8; i++)
  51. {
  52. while(read_pin(bus->ack)) micro_sleep(10);
  53. write_pin(bus->data, (x&(1<<i))?1:0);
  54. write_pin(bus->clk, 1);
  55. while(!read_pin(bus->ack)) micro_sleep(10);
  56. write_pin(bus->clk, 0);
  57. }
  58. }
  59. char _bus_read(bus_t* bus)
  60. {
  61. int x=0, i, j=0;
  62. if(bus->ismaster) return -1;
  63. for(i=0; i<8; i++)
  64. {
  65. write_pin(bus->ack, 0);
  66. while(!read_pin(bus->clk)) micro_sleep(10);
  67. j=read_pin(bus->data);
  68. x+=j<<i;
  69. write_pin(bus->ack, 1);
  70. micro_sleep(50);
  71. write_pin(bus->ack, 0);
  72. }
  73. return x;
  74. }
  75. void* bus_send_thread(void* _bus)
  76. {
  77. bus_t* bus = (bus_t*)_bus;
  78. if(!bus->ismaster) return NULL;
  79. while(1)
  80. {
  81. while(!file_size(&bus->buffer)) micro_sleep(10);
  82. _bus_write(bus, file_consume(&bus->buffer));
  83. }
  84. return NULL;
  85. }
  86. void* bus_recv_thread(void* _bus)
  87. {
  88. bus_t* bus = (bus_t*)_bus;
  89. if(bus->ismaster) return NULL;
  90. while(1)
  91. {
  92. file_produce(&bus->buffer, _bus_read(bus));
  93. }
  94. return NULL;
  95. }
  96. void bus_write(bus_t* bus, const void* x, int length)
  97. {
  98. const uint8_t *iter=(const uint8_t*)x;
  99. int i;
  100. if(!bus->ismaster) return;
  101. for(i=0; i<length; i++)
  102. file_produce(&bus->buffer, iter[i]);
  103. }
  104. void bus_read(bus_t* bus, void* x, int length)
  105. {
  106. uint8_t *iter=(uint8_t*)x;
  107. int i;
  108. if(bus->ismaster) return;
  109. for(i=0; i<length; i++)
  110. iter[i]=file_consume(&bus->buffer);
  111. }
  112. void bus_write_sync(bus_t* bus, const void* x, int length)
  113. {
  114. const uint8_t *iter=(const uint8_t*)x;
  115. int i;
  116. if(!bus->ismaster) return;
  117. for(i=0; i<length; i++)
  118. _bus_write(bus, iter[i]);
  119. }