mirror of https://github.com/ARMmbed/mbed-os.git
Fix TT_M3HQ build problem with SPI
parent
ce58505fa4
commit
3c2ed16fce
|
@ -32,6 +32,12 @@
|
||||||
#include "pinmap.h"
|
#include "pinmap.h"
|
||||||
#include "gpio_include.h"
|
#include "gpio_include.h"
|
||||||
|
|
||||||
|
#if DEVICE_SPI_ASYNCH
|
||||||
|
#define SPI_S(obj) (struct spi_s *) (&((obj)->spi))
|
||||||
|
#else
|
||||||
|
#define SPI_S(obj) (struct spi_s *) (obj)
|
||||||
|
#endif
|
||||||
|
|
||||||
static const PinMap PinMap_SPI_SCLK[] = {
|
static const PinMap PinMap_SPI_SCLK[] = {
|
||||||
{PM0, SPI_0, PIN_DATA(3, 1)},
|
{PM0, SPI_0, PIN_DATA(3, 1)},
|
||||||
{PB2, SPI_1, PIN_DATA(3, 1)},
|
{PB2, SPI_1, PIN_DATA(3, 1)},
|
||||||
|
@ -69,6 +75,7 @@ static const PinMap PinMap_SPI_SSEL[] = {
|
||||||
|
|
||||||
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
|
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
// Check pin parameters
|
// Check pin parameters
|
||||||
SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
|
SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
|
||||||
|
@ -78,9 +85,9 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
||||||
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
|
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
|
||||||
SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
|
SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
|
||||||
|
|
||||||
obj->module = (SPIName)pinmap_merge(spi_data, spi_cntl);
|
obj_s->module = (SPIName)pinmap_merge(spi_data, spi_cntl);
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
switch ((int)obj->module) {
|
switch ((int)obj_s->module) {
|
||||||
case SPI_0:
|
case SPI_0:
|
||||||
TSB_CG_FSYSENA_IPENA11 = ENABLE;
|
TSB_CG_FSYSENA_IPENA11 = ENABLE;
|
||||||
TSB_CG_FSYSENB_IPENB00 = ENABLE;
|
TSB_CG_FSYSENB_IPENB00 = ENABLE;
|
||||||
|
@ -110,7 +117,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
||||||
error("Cannot found SPI module corresponding with input pins.");
|
error("Cannot found SPI module corresponding with input pins.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
obj->spi = spi;
|
obj_s->spi = spi;
|
||||||
// pin out the SPI pins
|
// pin out the SPI pins
|
||||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||||
|
@ -146,20 +153,22 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
||||||
|
|
||||||
void spi_free(spi_t *obj)
|
void spi_free(spi_t *obj)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
|
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
spi->CR0 |= TSPI_DISABLE;
|
spi->CR0 |= TSPI_DISABLE;
|
||||||
spi->CR2 = TSPI_INT_ALL; // Disable all interrupt
|
spi->CR2 = TSPI_INT_ALL; // Disable all interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
|
|
||||||
obj->bits = bits;
|
obj_s->bits = bits;
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
obj->bits = bits;
|
obj_s->bits = bits;
|
||||||
spi->CR0 |= TSPI_DISABLE;
|
spi->CR0 |= TSPI_DISABLE;
|
||||||
|
|
||||||
if (bits >= 8 || bits <= 32) {
|
if (bits >= 8 || bits <= 32) {
|
||||||
|
@ -174,10 +183,11 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
|
|
||||||
void spi_frequency(spi_t *obj, int hz)
|
void spi_frequency(spi_t *obj, int hz)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
int clk_div = 1;
|
int clk_div = 1;
|
||||||
uint32_t clocks = ((SystemCoreClock / 2) / hz);
|
uint32_t clocks = ((SystemCoreClock / 2) / hz);
|
||||||
obj->spi->CR0 |= TSPI_DISABLE;
|
obj_s->spi->CR0 |= TSPI_DISABLE;
|
||||||
|
|
||||||
while (clk_div < 10) {
|
while (clk_div < 10) {
|
||||||
if (clocks < 16) {
|
if (clocks < 16) {
|
||||||
|
@ -190,7 +200,7 @@ void spi_frequency(spi_t *obj, int hz)
|
||||||
if (clk_div == 0) {
|
if (clk_div == 0) {
|
||||||
clocks++;
|
clocks++;
|
||||||
}
|
}
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
spi->CR0 |= TSPI_DISABLE;
|
spi->CR0 |= TSPI_DISABLE;
|
||||||
spi->BR = ((clk_div << 4) | clocks);
|
spi->BR = ((clk_div << 4) | clocks);
|
||||||
spi->CR0 |= TSPI_ENABLE;
|
spi->CR0 |= TSPI_ENABLE;
|
||||||
|
@ -198,9 +208,10 @@ void spi_frequency(spi_t *obj, int hz)
|
||||||
|
|
||||||
int spi_master_write(spi_t *obj, int value)
|
int spi_master_write(spi_t *obj, int value)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
MBED_ASSERT(obj != NULL);
|
MBED_ASSERT(obj_s != NULL);
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
spi->CR3 |= TSPI_TX_BUFF_CLR_DONE; // FIFO Cear
|
spi->CR3 |= TSPI_TX_BUFF_CLR_DONE; // FIFO Cear
|
||||||
// Check if the TSPI is already enabled
|
// Check if the TSPI is already enabled
|
||||||
if((spi->CR0 & TSPI_ENABLE) != TSPI_ENABLE) {
|
if((spi->CR0 & TSPI_ENABLE) != TSPI_ENABLE) {
|
||||||
|
@ -258,10 +269,11 @@ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
|
||||||
|
|
||||||
int spi_busy(spi_t *obj)
|
int spi_busy(spi_t *obj)
|
||||||
{
|
{
|
||||||
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
TSB_TSPI_TypeDef* spi;
|
TSB_TSPI_TypeDef* spi;
|
||||||
uint8_t result = 0;
|
uint8_t result = 0;
|
||||||
|
|
||||||
spi = obj->spi;
|
spi = obj_s->spi;
|
||||||
if( (spi->SR & (1<<7)) || (spi->SR & (1<<23))) {
|
if( (spi->SR & (1<<7)) || (spi->SR & (1<<23))) {
|
||||||
result = 1;
|
result = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -272,7 +284,8 @@ int spi_busy(spi_t *obj)
|
||||||
|
|
||||||
uint8_t spi_get_module(spi_t *obj)
|
uint8_t spi_get_module(spi_t *obj)
|
||||||
{
|
{
|
||||||
return (uint8_t)(obj->module);
|
struct spi_s *obj_s = SPI_S(obj);
|
||||||
|
return (uint8_t)(obj_s->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PinMap *spi_master_mosi_pinmap()
|
const PinMap *spi_master_mosi_pinmap()
|
||||||
|
|
Loading…
Reference in New Issue