Added mutex for multiple SPI devices on the same SPI bus
Fork of cc3000_hostdriver_mbedsocket by
Diff: cc3000_spi.cpp
- Revision:
- 47:cc9a2501e29f
- Parent:
- 45:50ab13d8f2dc
--- a/cc3000_spi.cpp Sun Nov 10 21:41:44 2013 +0100 +++ b/cc3000_spi.cpp Thu Oct 16 13:39:08 2014 +0000 @@ -43,8 +43,8 @@ namespace mbed_cc3000 { -cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, cc3000_event &event, cc3000_simple_link &simple_link) - : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _event(event), _simple_link(simple_link) { +cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex, cc3000_event &event, cc3000_simple_link &simple_link) + : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _mutex(mutex), _event(event), _simple_link(simple_link) { _wlan_spi.format(8,1); _wlan_spi.frequency(12000000); @@ -90,6 +90,7 @@ } uint32_t cc3000_spi::first_write(uint8_t *buffer, uint16_t length) { + _mutex.lock(); _wlan_cs = 0; wait_us(50); @@ -99,7 +100,8 @@ write_synchronous(buffer + 4, length - 4); _spi_info.spi_state = eSPI_STATE_IDLE; _wlan_cs = 1; - + _mutex.unlock(); + return 0; } @@ -144,6 +146,7 @@ _spi_info.tx_packet_length = length; // Assert the CS line and wait until the IRQ line is active, then initialize the write operation + _mutex.lock(); _wlan_cs = 0; wlan_irq_enable(); @@ -224,6 +227,7 @@ } else if (_spi_info.spi_state == eSPI_STATE_IDLE) { _spi_info.spi_state = eSPI_STATE_READ_IRQ; /* IRQ line goes low - acknowledge it */ + _mutex.lock(); _wlan_cs = 0; read_synchronous(_simple_link.get_received_buffer(), 10); _spi_info.spi_state = eSPI_STATE_READ_EOT; @@ -234,6 +238,7 @@ // Trigger Rx processing wlan_irq_disable(); _wlan_cs = 1; + _mutex.unlock(); // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size) // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever! uint8_t *received_buffer = _simple_link.get_received_buffer(); @@ -248,6 +253,7 @@ write_synchronous(_simple_link.get_transmit_buffer(), _spi_info.tx_packet_length); _spi_info.spi_state = eSPI_STATE_IDLE; _wlan_cs = 1; + _mutex.unlock(); } } }