test_spi_master.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. Tests for the spi_master device driver
  3. */
  4. #include <esp_types.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <malloc.h>
  8. #include <string.h>
  9. #include "rom/ets_sys.h"
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/task.h"
  12. #include "freertos/semphr.h"
  13. #include "freertos/queue.h"
  14. #include "freertos/xtensa_api.h"
  15. #include "unity.h"
  16. #include "driver/spi_master.h"
  17. #include "soc/dport_reg.h"
  18. #include "soc/spi_reg.h"
  19. #include "soc/spi_struct.h"
  20. static void check_spi_pre_n_for(int clk, int pre, int n)
  21. {
  22. esp_err_t ret;
  23. spi_device_handle_t handle;
  24. spi_device_interface_config_t devcfg={
  25. .command_bits=0,
  26. .address_bits=0,
  27. .dummy_bits=0,
  28. .clock_speed_hz=clk,
  29. .duty_cycle_pos=128,
  30. .mode=0,
  31. .spics_io_num=21,
  32. .queue_size=3
  33. };
  34. char sendbuf[16]="";
  35. spi_transaction_t t;
  36. memset(&t, 0, sizeof(t));
  37. ret=spi_bus_add_device(HSPI_HOST, &devcfg, &handle);
  38. TEST_ASSERT(ret==ESP_OK);
  39. t.length=16*8;
  40. t.tx_buffer=sendbuf;
  41. ret=spi_device_transmit(handle, &t);
  42. printf("Checking clk rate %dHz. expect pre %d n %d, got pre %d n %d\n", clk, pre, n, SPI2.clock.clkdiv_pre+1, SPI2.clock.clkcnt_n+1);
  43. TEST_ASSERT(SPI2.clock.clkcnt_n+1==n);
  44. TEST_ASSERT(SPI2.clock.clkdiv_pre+1==pre);
  45. ret=spi_bus_remove_device(handle);
  46. TEST_ASSERT(ret==ESP_OK);
  47. }
  48. TEST_CASE("SPI Master clockdiv calculation routines", "[spi]")
  49. {
  50. spi_bus_config_t buscfg={
  51. .mosi_io_num=4,
  52. .miso_io_num=16,
  53. .sclk_io_num=25,
  54. .quadwp_io_num=-1,
  55. .quadhd_io_num=-1
  56. };
  57. esp_err_t ret;
  58. ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1);
  59. TEST_ASSERT(ret==ESP_OK);
  60. check_spi_pre_n_for(8000000, 1, 10);
  61. check_spi_pre_n_for(800000, 2, 50);
  62. check_spi_pre_n_for(100000, 16, 50);
  63. check_spi_pre_n_for(333333, 4, 60);
  64. check_spi_pre_n_for(1, 8192, 64); //Actually should generate the minimum clock speed, 152Hz
  65. ret=spi_bus_free(HSPI_HOST);
  66. TEST_ASSERT(ret==ESP_OK);
  67. }
  68. static void test_spi_bus_speed(int hz) {
  69. esp_err_t ret;
  70. spi_device_handle_t handle;
  71. spi_device_interface_config_t devcfg={
  72. .command_bits=8,
  73. .address_bits=64,
  74. .dummy_bits=0,
  75. .clock_speed_hz=hz,
  76. .duty_cycle_pos=128,
  77. .mode=0,
  78. .spics_io_num=21,
  79. .queue_size=3,
  80. };
  81. ret=spi_bus_add_device(HSPI_HOST, &devcfg, &handle);
  82. TEST_ASSERT(ret==ESP_OK);
  83. printf("Bus/dev inited.\n");
  84. spi_transaction_t t;
  85. char sendbuf[64]="Hello World!";
  86. char recvbuf[64]="UUUUUUUUUUUUUUU";
  87. memset(&t, 0, sizeof(t));
  88. t.length=64*8;
  89. t.tx_buffer=sendbuf;
  90. t.rx_buffer=recvbuf;
  91. t.address=0xA00000000000000FL;
  92. t.command=0x55;
  93. printf("Transmit...\n");
  94. ret=spi_device_transmit(handle, &t);
  95. TEST_ASSERT(ret==ESP_OK);
  96. printf("Send vs recv:\n");
  97. for (int x=0; x<16; x++) printf("%02X ", (int)sendbuf[x]);
  98. printf("<sent\n");
  99. for (int x=0; x<16; x++) printf("%02X ", (int)recvbuf[x]);
  100. printf("<recv\n");
  101. ret=spi_bus_remove_device(handle);
  102. TEST_ASSERT(ret==ESP_OK);
  103. TEST_ASSERT_EQUAL_INT8_ARRAY(sendbuf, recvbuf, 64);
  104. }
  105. TEST_CASE("SPI Master test", "[spi][ignore]")
  106. {
  107. spi_bus_config_t buscfg={
  108. .mosi_io_num=4,
  109. .miso_io_num=16,
  110. .sclk_io_num=25,
  111. .quadwp_io_num=-1,
  112. .quadhd_io_num=-1
  113. };
  114. esp_err_t ret;
  115. printf("THIS TEST NEEDS A JUMPER BETWEEN IO4 AND IO16\n");
  116. ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1);
  117. TEST_ASSERT(ret==ESP_OK);
  118. int freqs[]={8000, 1000000, 5000000, 10000000, 20000000, 26666666, 0};
  119. for (int x=0; freqs[x]!=0; x++) {
  120. printf("Testing clock speed of %dHz...\n", freqs[x]);
  121. test_spi_bus_speed(freqs[x]);
  122. }
  123. ret=spi_bus_free(HSPI_HOST);
  124. TEST_ASSERT(ret==ESP_OK);
  125. }