The program demonstrates how to implement SPI on RedBearLab nRF51822 platform
Dependencies: mbed
The program demonstrates how to implement SPI on RedBearLab nRF51822 platform.
Revision 0:281fa0c39c15, committed 2014-10-22
- Comitter:
- RedBearLab
- Date:
- Wed Oct 22 05:12:07 2014 +0000
- Child:
- 1:a7087bcd5c28
- Commit message:
- First commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 22 05:12:07 2014 +0000 @@ -0,0 +1,108 @@ +/* + +Copyright (c) 2012-2014 RedBearLab + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include "mbed.h" +#include "spi_mast.h" + +DigitalOut spi_cs(P0_14);//D10 + +SPIClass SPI1(NRF_SPI1); + +//SPI spi(P0_20, P0_22, P0_25);//MOSI, MISO, SCLK +//SPI spi(P0_12, P0_13, P0_15);//D11, D12, D13 + + + +Serial pc(USBTX, USBRX); + +void Flash_Buff_WriteBytes(uint16_t addr, uint8_t *pbuf, uint16_t len) +{ + uint16_t index; + + spi_cs = 0; + wait_us(200); + + SPI1.transfer(0x84); + SPI1.transfer(0x00); + SPI1.transfer((uint8_t)(addr>>8)); + SPI1.transfer((uint8_t)addr); + for(index=0; index<len; index++) + { + SPI1.transfer(*pbuf); + pbuf++; + } + + wait_us(200); + spi_cs = 1; +} + +void Flash_Buff_ReadBytes(uint16_t addr, uint8_t *pbuf, uint16_t len) +{ + uint16_t index; + + spi_cs = 0; + wait_us(200); + + SPI1.transfer(0xD1); + SPI1.transfer(0x00); + SPI1.transfer((uint8_t)(addr>>8)); + SPI1.transfer((uint8_t)addr); + for(index=0; index<len; index++) + { + *pbuf = SPI1.transfer(0x00); + pbuf++; + } + + wait_us(200); + spi_cs = 1; +} + +uint8_t i; +uint8_t wt_buf[7] = {'H','e','l','l', 'o', '\r', '\n'}; +uint8_t rd_buf[7]; + +int main(void) +{ + pc.baud(9600); + wait(8); + spi_cs = 1; + pc.printf("SPI Demo Start \r\n"); + + //SPI1.begin(); + SPI1.begin(P0_15, P0_12, P0_13); + + wait(1); + Flash_Buff_WriteBytes(0, wt_buf, 7); + while(1) + { + memset(rd_buf, 0x00, 7); + Flash_Buff_ReadBytes(0, rd_buf, 7); + for(i=0; i<7; i++) + pc.putc(rd_buf[i]); + wait(1); + } +} + + + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Oct 22 05:12:07 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spi_master.cpp Wed Oct 22 05:12:07 2014 +0000 @@ -0,0 +1,236 @@ +/* + +Copyright (c) 2012-2014 RedBearLab + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include "spi_mast.h" + +/********************************************************************** +name : +function : +**********************************************************************/ +SPIClass::SPIClass(NRF_SPI_Type *_spi) : spi(_spi) +{ + //do nothing +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::setCPOL( bool active_low) +{ + if(active_low) + { + spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos); + } + else + { + spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos); + } +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::setCPHA( bool trailing) +{ + if(trailing) + { + spi->CONFIG |= (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos); + } + else + { + spi->CONFIG |= (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos); + } + +} + +/********************************************************************** +name : +function : MSBFIRST, LSBFIRST +**********************************************************************/ +void SPIClass::setBitORDER( BitOrder bit) +{ + if(bit == MSBFIRST) + { + spi->CONFIG |= (SPI_CONFIG_ORDER_MsbFirst << SPI_CONFIG_ORDER_Pos); + } + else + { + spi->CONFIG |= (SPI_CONFIG_ORDER_LsbFirst << SPI_CONFIG_ORDER_Pos); + } +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::setFrequency(uint8_t speed) +{ + if (speed == 0) + { + spi->FREQUENCY = SPI_FREQUENCY_125K; + } + else if (speed == 1) + { + spi->FREQUENCY = SPI_FREQUENCY_250K; + } + else if (speed == 2) + { + spi->FREQUENCY = SPI_FREQUENCY_500K; + } + else if (speed == 3) + { + spi->FREQUENCY = SPI_FREQUENCY_1M; + } + else if (speed == 4) + { + spi->FREQUENCY = SPI_FREQUENCY_2M; + } + else if (speed == 5) + { + spi->FREQUENCY = SPI_FREQUENCY_4M; + } + else if (speed == 6) + { + spi->FREQUENCY = SPI_FREQUENCY_8M; + } + else + { + spi->FREQUENCY = SPI_FREQUENCY_4M; + } +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::setSPIMode( uint8_t mode ) +{ + if (SPI_MODE0 == mode) + { + setCPOL(0); + setCPHA(0); + } + else if (mode == SPI_MODE1) + { + setCPOL(0); + setCPHA(1); + } + else if (mode == SPI_MODE2) + { + setCPOL(1); + setCPHA(0); + } + else if (mode == SPI_MODE3) + { + setCPOL(1); + setCPHA(1); + } + else + { + setCPOL(0); + setCPHA(0); + } +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::begin(uint32_t sck, uint32_t mosi, uint32_t miso) +{ + + SCK_Pin = sck; + MOSI_Pin = mosi; + MISO_Pin = miso; + + NRF_GPIO->PIN_CNF[SCK_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) + | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) + | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) + | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) + | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); + + NRF_GPIO->PIN_CNF[MOSI_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) + | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) + | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) + | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) + | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); + + NRF_GPIO->PIN_CNF[MISO_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) + | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) + | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) + | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) + | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); + spi->PSELSCK = SCK_Pin; + spi->PSELMOSI = MOSI_Pin; + spi->PSELMISO = MISO_Pin; + + setFrequency(SPI_2M); + setSPIMode(SPI_MODE0); + setBitORDER(MSBFIRST); + + spi->EVENTS_READY = 0; + spi->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos); + +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::begin() +{ + begin(SCK, MOSI, MISO); +} + +/********************************************************************** +name : +function : +**********************************************************************/ +uint8_t SPIClass::transfer(uint8_t data) +{ + while( spi->EVENTS_READY != 0U ); + + spi->TXD = (uint32_t)data; + + while(spi->EVENTS_READY == 0); + + data = (uint8_t)spi->RXD; + + spi->EVENTS_READY = 0; + + return data; +} + +/********************************************************************** +name : +function : +**********************************************************************/ +void SPIClass::endTransfer() +{ + spi->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos); +} + +/********************************************************************** +name : +function : +**********************************************************************/ + +//SPIClass SPI(NRF_SPI1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spi_master.h Wed Oct 22 05:12:07 2014 +0000 @@ -0,0 +1,84 @@ +/* + +Copyright (c) 2012-2014 RedBearLab + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef _SPI_H_ +#define _SPI_H_ + +#include "mbed.h" + +#define SPI_FREQUENCY_125K 0x02000000UL +#define SPI_FREQUENCY_250K 0x04000000UL +#define SPI_FREQUENCY_500K 0x08000000UL +#define SPI_FREQUENCY_1M 0x10000000UL +#define SPI_FREQUENCY_2M 0x20000000UL +#define SPI_FREQUENCY_4M 0x40000000UL +#define SPI_FREQUENCY_8M 0x80000000UL + +#define SPI_125K 0 +#define SPI_250K 1 +#define SPI_500K 2 +#define SPI_1M 3 +#define SPI_2M 4 +#define SPI_4M 5 +#define SPI_8M 6 + +#define SPI_MODE0 0 +#define SPI_MODE1 1 +#define SPI_MODE2 2 +#define SPI_MODE3 3 + +#define CS P0_14 +#define SCK P0_25 +#define MOSI P0_20 +#define MISO P0_22 + +typedef enum{ + + MSBFIRST = 0, + LSBFIRST = 1 + +}BitOrder; + +class SPIClass +{ + public: + SPIClass(NRF_SPI_Type *_spi); + + void begin(); + void begin(uint32_t sck, uint32_t mosi, uint32_t miso); + uint8_t transfer(uint8_t data); + void endTransfer(); + + void setSPIMode( uint8_t mode ); + void setFrequency(uint8_t speed ); + void setBitORDER( BitOrder bit); + void setCPHA( bool trailing); + void setCPOL( bool active_low); + + + private: + NRF_SPI_Type *spi; + + uint32_t SCK_Pin; + uint32_t MOSI_Pin; + uint32_t MISO_Pin; + +}; + +#endif