8
8
*/
9
9
10
10
#include <stdio.h>
11
-
11
+ #include <sys/time.h>
12
12
#include "freertos/FreeRTOS.h"
13
13
#include "freertos/task.h"
14
- #include "freertos/queue.h"
14
+ #include "freertos/semphr.h"
15
+ #include "ringbuf.h"
15
16
17
+ #include "esp8266/spi_struct.h"
16
18
#include "esp8266/gpio_struct.h"
19
+ #include "esp_system.h"
17
20
#include "esp_log.h"
18
21
19
22
#include "driver/gpio.h"
20
23
#include "driver/spi.h"
21
24
22
25
static const char * TAG = "spi_master_example" ;
23
26
24
- #define SPI_SLAVE_HANDSHARK_GPIO 4
25
- #define SPI_SLAVE_HANDSHARK_SEL (1ULL<<SPI_SLAVE_HANDSHARK_GPIO )
27
+ #define SPI_MASTER_HANDSHARK_GPIO 4
28
+ #define SPI_MASTER_HANDSHARK_SEL (1ULL<<SPI_MASTER_HANDSHARK_GPIO )
26
29
27
- static xQueueHandle gpio_evt_queue = NULL ;
30
+ RingbufHandle_t spi_master_rx_ring_buf ;
31
+ struct timeval now ;
28
32
29
33
static void gpio_isr_handler (void * arg )
30
34
{
35
+ int x ;
31
36
BaseType_t xHigherPriorityTaskWoken ;
32
- uint32_t gpio_num = (uint32_t ) arg ;
33
-
34
- xQueueSendFromISR (gpio_evt_queue , & gpio_num , & xHigherPriorityTaskWoken );
35
-
36
- if (xHigherPriorityTaskWoken == pdTRUE ) {
37
- taskYIELD ();
38
- }
39
- }
40
-
41
- void IRAM_ATTR spi_event_callback (int event , void * arg )
42
- {
43
- switch (event ) {
44
- case SPI_INIT_EVENT : {
45
-
46
- }
47
- break ;
48
-
49
- case SPI_TRANS_START_EVENT : {
50
-
51
- }
52
- break ;
53
-
54
- case SPI_TRANS_DONE_EVENT : {
37
+ uint32_t read_data [8 ];
55
38
39
+ if ((int )arg == SPI_MASTER_HANDSHARK_GPIO ) {
40
+ while (SPI1 .cmd .usr );
41
+ SPI1 .user .usr_command = 1 ;
42
+ SPI1 .user .usr_addr = 1 ;
43
+ SPI1 .user .usr_mosi = 0 ;
44
+ SPI1 .user .usr_miso = 1 ;
45
+ SPI1 .user2 .usr_command_bitlen = 8 - 1 ;
46
+ SPI1 .user1 .usr_addr_bitlen = 32 - 1 ;
47
+ SPI1 .user1 .usr_miso_bitlen = 32 * 8 - 1 ;
48
+ SPI1 .user2 .usr_command_value = SPI_MASTER_READ_DATA_FROM_SLAVE_CMD ;
49
+ SPI1 .addr = 0 ;
50
+ SPI1 .cmd .usr = 1 ;
51
+ while (SPI1 .cmd .usr );
52
+ for (x = 0 ; x < 8 ; x ++ ) {
53
+ read_data [x ] = SPI1 .data_buf [x ];
56
54
}
57
- break ;
58
-
59
- case SPI_DEINIT_EVENT : {
55
+ xRingbufferSendFromISR (spi_master_rx_ring_buf , (void * ) read_data , sizeof (uint32_t ) * 8 , & xHigherPriorityTaskWoken );
60
56
57
+ if (xHigherPriorityTaskWoken == pdTRUE ) {
58
+ taskYIELD ();
61
59
}
62
- break ;
63
60
}
64
-
65
61
}
66
62
67
63
static void spi_master_write_slave_task (void * arg )
68
64
{
69
- uint16_t cmd ;
70
- uint32_t addr ;
65
+ int x ;
71
66
uint32_t write_data [8 ];
72
67
spi_trans_t trans ;
73
- uint32_t status ;
68
+ uint16_t cmd ;
69
+ uint32_t addr ;
70
+ uint64_t time_start , time_end ;
74
71
72
+ trans .bits .val = 0 ;
73
+ trans .bits .cmd = 8 * 1 ;
74
+ trans .bits .addr = 32 * 1 ;
75
+ trans .bits .mosi = 32 * 8 ;
76
+ // Write data to the ESP8266 Slave use "SPI_MASTER_WRITE_DATA_TO_SLAVE_CMD" cmd
75
77
trans .cmd = & cmd ;
76
78
trans .addr = & addr ;
77
- addr = 0x0 ;
78
- write_data [0 ] = 0 ;
79
+ trans .mosi = write_data ;
80
+ cmd = SPI_MASTER_WRITE_DATA_TO_SLAVE_CMD ;
81
+ addr = 0 ;
82
+ write_data [0 ] = 1 ;
79
83
write_data [1 ] = 0x11111111 ;
80
84
write_data [2 ] = 0x22222222 ;
81
85
write_data [3 ] = 0x33333333 ;
@@ -85,103 +89,55 @@ static void spi_master_write_slave_task(void *arg)
85
89
write_data [7 ] = 0x77777777 ;
86
90
87
91
while (1 ) {
88
- if (addr % 50 == 0 ) {
89
- vTaskDelay (1000 / portTICK_RATE_MS );
90
- }
91
-
92
- trans .miso = & status ;
93
- trans .bits .val = 0 ;
94
- trans .bits .cmd = 8 * 1 ;
95
- trans .bits .miso = 32 * 1 ;
96
- // Read status from the ESP8266 Slave use "SPI_MASTER_READ_STATUS_FROM_SLAVE_CMD" cmd
97
- cmd = SPI_MASTER_READ_STATUS_FROM_SLAVE_CMD ;
98
- // Get the slave status and send data when the slave is idle
99
- while (1 ) {
92
+ gettimeofday (& now , NULL );
93
+ time_start = now .tv_usec ;
94
+ for (x = 0 ;x < 100 ;x ++ ) {
100
95
spi_trans (HSPI_HOST , trans );
101
- if (status == true) {
102
- break ;
103
- }
104
- vTaskDelay (10 / portTICK_RATE_MS );
96
+ write_data [0 ]++ ;
105
97
}
98
+ gettimeofday (& now , NULL );
99
+ time_end = now .tv_usec ;
106
100
107
- trans .mosi = write_data ;
108
- trans .bits .val = 0 ;
109
- trans .bits .cmd = 8 * 1 ;
110
- trans .bits .addr = 32 * 1 ;
111
- trans .bits .mosi = 32 * 8 ;
112
- // Write data to the ESP8266 Slave use "SPI_MASTER_WRITE_DATA_TO_SLAVE_CMD" cmd
113
- cmd = SPI_MASTER_WRITE_DATA_TO_SLAVE_CMD ;
114
- spi_trans (HSPI_HOST , trans );
115
-
116
- addr ++ ;
117
- write_data [0 ]++ ;
118
- vTaskDelay (10 / portTICK_RATE_MS );
101
+ ESP_LOGI (TAG , "Master wrote 3200 bytes in %d us" , (int )(time_end - time_start ));
102
+ vTaskDelay (100 / portTICK_RATE_MS );
119
103
}
120
104
}
121
105
122
106
static void spi_master_read_slave_task (void * arg )
123
107
{
124
- int x ;
125
- uint32_t io_num ;
126
- uint16_t cmd ;
127
- uint32_t addr ;
128
- uint32_t read_data [8 ];
129
- spi_trans_t trans ;
130
- uint32_t status = true;
131
-
132
- trans .cmd = & cmd ;
133
- // Write status to the ESP8266 Slave use "SPI_MASTER_WRITE_STATUS_TO_SLAVE_CMD" cmd
134
- cmd = SPI_MASTER_WRITE_STATUS_TO_SLAVE_CMD ;
135
- trans .mosi = & status ;
136
- trans .bits .val = 0 ;
137
- trans .bits .cmd = 8 * 1 ;
138
- trans .bits .mosi = 32 * 1 ;
139
- spi_trans (HSPI_HOST , trans );
140
-
141
- trans .addr = & addr ;
142
- trans .miso = read_data ;
143
- trans .bits .val = 0 ;
144
- trans .bits .cmd = 8 * 1 ;
145
- trans .bits .addr = 32 * 1 ;
146
- trans .bits .miso = 32 * 8 ;
147
- // Read data from the ESP8266 Slave use "SPI_MASTER_READ_DATA_FROM_SLAVE_CMD" cmd
148
- cmd = SPI_MASTER_READ_DATA_FROM_SLAVE_CMD ;
149
- addr = 0x0 ;
108
+ uint32_t * read_data = NULL ;
109
+ uint32_t size ;
150
110
151
111
while (1 ) {
152
- xQueueReceive ( gpio_evt_queue , & io_num , portMAX_DELAY );
112
+ read_data = ( uint32_t * ) xRingbufferReceive ( spi_master_rx_ring_buf , & size , portMAX_DELAY );
153
113
154
- if (SPI_SLAVE_HANDSHARK_GPIO != io_num ) {
155
- break ;
156
- }
157
-
158
- spi_trans (HSPI_HOST , trans );
159
- ESP_LOGI (TAG , "------Master read------\n" );
160
- ESP_LOGI (TAG , "addr: 0x%x\n" , addr );
161
-
162
- for (x = 0 ; x < 8 ; x ++ ) {
163
- ESP_LOGI (TAG , "read_data[%d]: 0x%x\n" , x , read_data [x ]);
114
+ if (read_data ) {
115
+ vRingbufferReturnItem (spi_master_rx_ring_buf , read_data );
116
+ if (read_data [7 ] % 100 == 0 ) {
117
+ vTaskDelay (100 / portTICK_RATE_MS );
118
+ }
164
119
}
165
-
166
- addr ++ ;
167
120
}
168
121
}
169
122
170
123
void app_main (void )
171
124
{
172
- gpio_evt_queue = xQueueCreate (1 , sizeof (uint32_t ));
125
+ spi_trans_t trans = {0 };
126
+ uint16_t cmd ;
127
+ uint32_t status = true;
128
+ spi_master_rx_ring_buf = xRingbufferCreate (4096 , RINGBUF_TYPE_NOSPLIT );
173
129
174
130
ESP_LOGI (TAG , "init gpio" );
175
131
gpio_config_t io_conf ;
176
132
io_conf .intr_type = GPIO_INTR_POSEDGE ;
177
133
io_conf .mode = GPIO_MODE_INPUT ;
178
- io_conf .pin_bit_mask = SPI_SLAVE_HANDSHARK_SEL ;
134
+ io_conf .pin_bit_mask = SPI_MASTER_HANDSHARK_SEL ;
179
135
io_conf .pull_down_en = 0 ;
180
136
io_conf .pull_up_en = 0 ;
181
137
gpio_config (& io_conf );
182
138
183
139
gpio_install_isr_service (0 );
184
- gpio_isr_handler_add (SPI_SLAVE_HANDSHARK_GPIO , gpio_isr_handler , (void * ) SPI_SLAVE_HANDSHARK_GPIO );
140
+ gpio_isr_handler_add (SPI_MASTER_HANDSHARK_GPIO , gpio_isr_handler , (void * ) SPI_MASTER_HANDSHARK_GPIO );
185
141
186
142
ESP_LOGI (TAG , "init spi" );
187
143
spi_config_t spi_config ;
@@ -197,9 +153,18 @@ void app_main(void)
197
153
// Set the SPI clock frequency division factor
198
154
spi_config .clk_div = SPI_10MHz_DIV ;
199
155
// Register SPI event callback function
200
- spi_config .event_cb = spi_event_callback ;
156
+ spi_config .event_cb = NULL ;
201
157
spi_init (HSPI_HOST , & spi_config );
202
158
159
+ // Write status to the ESP8266 Slave use "SPI_MASTER_WRITE_STATUS_TO_SLAVE_CMD" cmd
160
+ cmd = SPI_MASTER_WRITE_STATUS_TO_SLAVE_CMD ;
161
+ trans .cmd = & cmd ;
162
+ trans .mosi = & status ;
163
+ trans .bits .val = 0 ;
164
+ trans .bits .cmd = 8 * 1 ;
165
+ trans .bits .mosi = 32 * 1 ;
166
+ spi_trans (HSPI_HOST , trans );
167
+
203
168
// create spi_master_write_slave_task
204
169
xTaskCreate (spi_master_write_slave_task , "spi_master_write_slave_task" , 2048 , NULL , 10 , NULL );
205
170
0 commit comments