Advertisement
Guest User

Untitled

a guest
May 19th, 2024
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #define STM32F0 1
  2.  
  3. #include <libopencm3/stm32/rcc.h>
  4. #include <libopencm3/stm32/gpio.h>
  5. #include <libopencm3/stm32/spi.h>
  6.  
  7. // PB13 - red - SCK
  8. // PB12 - green - CS
  9. // PB14 - purple - SO
  10. // PB15 - black - SI
  11.  
  12. #define SPI_PORT GPIOB
  13. #define SPI_SCK GPIO13
  14. #define SPI_CS GPIO12
  15. #define SPI_SO GPIO14
  16. #define SPI_SI GPIO15
  17.  
  18. // Register addresses of MCP23S08
  19. #define MCP_IODIR 0x00
  20. #define MCP_IPOL 0x01
  21. #define MCP_GPINTEN 0x02
  22. #define MCP_DEFVAL 0x03
  23. #define MCP_INTCON 0x04
  24. #define MCP_IOCON 0x05
  25. #define MCP_GPPU 0x06
  26. #define MCP_INTF 0x07
  27. #define MCP_INTCAP 0x08
  28. #define MCP_GPIO 0x09
  29. #define MCP_OLAT 0x0A
  30.  
  31. #define WRITE 0x40
  32. #define READ 0x41
  33.  
  34. void sendData(uint8_t *data, int n);
  35. uint8_t receiveData(void);
  36.  
  37. int main(void)
  38. {
  39. rcc_periph_clock_enable(RCC_GPIOB);
  40. rcc_periph_clock_enable(RCC_SPI2);
  41.  
  42. gpio_mode_setup(SPI_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, SPI_SCK | SPI_SO | SPI_SI);
  43. gpio_set_af(SPI_PORT, GPIO_AF0, SPI_SCK | SPI_SO | SPI_SI);
  44.  
  45. gpio_mode_setup(SPI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SPI_CS);
  46. gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO8);
  47.  
  48. gpio_set(SPI_PORT, SPI_CS);
  49. spi_reset(SPI2);
  50.  
  51. spi_init_master(
  52. SPI2,
  53. SPI_CR1_BAUDRATE_FPCLK_DIV_16,
  54. SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
  55. SPI_CR1_CPHA_CLK_TRANSITION_1,
  56. SPI_CR1_MSBFIRST);
  57.  
  58. spi_set_data_size(SPI2, SPI_CR2_DS_8BIT);
  59. spi_enable_software_slave_management(SPI2);
  60. // spi_enable_ss_output(SPI2);
  61. spi_set_nss_high(SPI2);
  62. spi_set_unidirectional_mode(SPI2);
  63. spi_enable(SPI2);
  64.  
  65. uint8_t init_data[3] = {WRITE, MCP_IODIR, 0xFE};
  66. sendData(init_data, 3);
  67.  
  68. uint8_t pullup_data[3] = {WRITE, MCP_GPPU, 0xFE};
  69. sendData(pullup_data, 3);
  70. uint8_t current_value = 1;
  71. while (true)
  72. {
  73. uint8_t data[3] = {WRITE, MCP_OLAT, current_value};
  74. for (int i = 0; i < 1000000; ++i)
  75. {
  76. __asm("nop");
  77. }
  78. sendData(data, 3);
  79. for (int i = 0; i < 1000000; ++i)
  80. {
  81. __asm("nop");
  82. }
  83. current_value = current_value == 1 ? 0 : 1;
  84. // Receive info from SPI
  85. uint8_t value = receiveData();
  86. if (value == 0b00100000)
  87. {
  88. gpio_set(GPIOB, GPIO8);
  89. }
  90. else
  91. {
  92. gpio_clear(GPIOB, GPIO8);
  93. }
  94. }
  95. return 0;
  96. }
  97.  
  98. void sendData(uint8_t *data, int n)
  99. {
  100. gpio_clear(SPI_PORT, SPI_CS);
  101. for (int i = 0; i < n; ++i)
  102. {
  103. spi_send8(SPI2, data[i]);
  104. }
  105. while (SPI_SR(SPI2) & SPI_SR_BSY)
  106. ;
  107. gpio_set(SPI_PORT, SPI_CS);
  108. }
  109.  
  110. uint8_t receiveData(void)
  111. {
  112. gpio_clear(SPI_PORT, SPI_CS);
  113. spi_send8(SPI2, READ);
  114. spi_send8(SPI2, MCP_GPIO);
  115. while (SPI_SR(SPI2) & SPI_SR_BSY)
  116. ;
  117. uint8_t value = spi_read8(SPI2);
  118. while (SPI_SR(SPI2) & SPI_SR_BSY)
  119. ;
  120. gpio_set(SPI_PORT, SPI_CS);
  121. return value;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement