bus.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. }
  32. void bus_init_send(bus_t* bus, int d, int clk, int ack)
  33. {
  34. bus->data=d;
  35. bus->clk=clk;
  36. bus->ack=ack;
  37. bus->ismaster=1;
  38. file_init(&bus->buffer);
  39. }
  40. void _bus_write(bus_t* bus, char x)
  41. {
  42. int i;
  43. if(!bus->ismaster) return;
  44. for(i=0; i<8; i++)
  45. {
  46. while(read_pin(bus->ack)) micro_sleep(10);
  47. write_pin(bus->data, (x&(1<<i))?1:0);
  48. write_pin(bus->clk, 1);
  49. while(!read_pin(bus->ack)) micro_sleep(10);
  50. write_pin(bus->clk, 0);
  51. }
  52. }
  53. char _bus_read(bus_t* bus)
  54. {
  55. int x=0, i, j=0;
  56. if(bus->ismaster) return -1;
  57. for(i=0; i<8; i++)
  58. {
  59. write_pin(bus->ack, 0);
  60. while(!read_pin(bus->clk)) micro_sleep(10);
  61. j=read_pin(bus->data);
  62. x+=j<<i;
  63. write_pin(bus->ack, 1);
  64. micro_sleep(50);
  65. write_pin(bus->ack, 0);
  66. }
  67. return x;
  68. }
  69. void* bus_send_thread(void* _bus)
  70. {
  71. bus_t* bus = (bus_t*)_bus;
  72. if(!bus->ismaster) return NULL;
  73. while(1)
  74. {
  75. while(!file_size(&bus->buffer)) micro_sleep(10);
  76. _bus_write(bus, file_consume(&bus->buffer));
  77. }
  78. return NULL;
  79. }
  80. void* bus_recv_thread(void* _bus)
  81. {
  82. bus_t* bus = (bus_t*)_bus;
  83. if(bus->ismaster) return NULL;
  84. while(1)
  85. {
  86. file_produce(&bus->buffer, _bus_read(bus));
  87. }
  88. return NULL;
  89. }
  90. void bus_write(bus_t* bus, const void* x, int length)
  91. {
  92. const uint8_t *iter=(const uint8_t*)x;
  93. int i;
  94. if(!bus->ismaster) return;
  95. for(i=0; i<length; i++)
  96. file_produce(&bus->buffer, iter[i]);
  97. }
  98. void bus_read(bus_t* bus, void* x, int length)
  99. {
  100. uint8_t *iter=(uint8_t*)x;
  101. int i;
  102. if(bus->ismaster) return;
  103. for(i=0; i<length; i++)
  104. iter[i]=file_consume(&bus->buffer);
  105. }
  106. void bus_write_sync(bus_t* bus, const void* x, int length)
  107. {
  108. const uint8_t *iter=(const uint8_t*)x;
  109. int i;
  110. if(!bus->ismaster) return;
  111. for(i=0; i<length; i++)
  112. _bus_write(bus, iter[i]);
  113. }