[bsp/nrf5x]fixed spi driver bugs
This commit is contained in:
parent
60e9808677
commit
ce9132ca53
|
@ -6,6 +6,7 @@
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
* Date Author Notes
|
* Date Author Notes
|
||||||
* 2020-05-22 Sherman first version
|
* 2020-05-22 Sherman first version
|
||||||
|
* 2020-11-02 xckhmf fixed bug
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
|
|
||||||
#ifdef BSP_USING_SPI
|
#ifdef BSP_USING_SPI
|
||||||
|
|
||||||
|
#if defined(BSP_USING_SPI0) || defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2)
|
||||||
static struct nrfx_drv_spi_config spi_config[] =
|
static struct nrfx_drv_spi_config spi_config[] =
|
||||||
{
|
{
|
||||||
#ifdef BSP_USING_SPI0
|
#ifdef BSP_USING_SPI0
|
||||||
|
@ -117,12 +119,12 @@ static rt_err_t spi_configure(struct rt_spi_device *device,
|
||||||
|
|
||||||
nrfx_spi_t spi = spi_bus_obj[index].spi;
|
nrfx_spi_t spi = spi_bus_obj[index].spi;
|
||||||
nrfx_spi_config_t config = NRFX_SPI_DEFAULT_CONFIG(bsp_spi_pin[index].sck_pin,
|
nrfx_spi_config_t config = NRFX_SPI_DEFAULT_CONFIG(bsp_spi_pin[index].sck_pin,
|
||||||
bsp_spi_pin[index].mosi_pin, bsp_spi_pin[index].miso_pin, bsp_spi_pin[index].ss_pin);
|
bsp_spi_pin[index].mosi_pin, bsp_spi_pin[index].miso_pin, NRFX_SPI_PIN_NOT_USED);
|
||||||
|
|
||||||
/* spi config ss pin */
|
/* spi config ss pin */
|
||||||
if(device->user_data != RT_NULL)
|
if(device->parent.user_data != RT_NULL)
|
||||||
{
|
{
|
||||||
config.ss_pin = (rt_uint8_t)device->user_data;
|
nrf_gpio_cfg_output((uint32_t)device->parent.user_data);
|
||||||
}
|
}
|
||||||
/* spi config bit order */
|
/* spi config bit order */
|
||||||
if(configuration->mode & RT_SPI_MSB)
|
if(configuration->mode & RT_SPI_MSB)
|
||||||
|
@ -198,32 +200,43 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
|
||||||
RT_ASSERT(device->bus->parent.user_data != RT_NULL);
|
RT_ASSERT(device->bus->parent.user_data != RT_NULL);
|
||||||
|
|
||||||
rt_uint8_t index = spi_index_find(device->bus);
|
rt_uint8_t index = spi_index_find(device->bus);
|
||||||
|
nrfx_err_t nrf_ret;
|
||||||
RT_ASSERT(index != 0xFF);
|
RT_ASSERT(index != 0xFF);
|
||||||
|
|
||||||
nrfx_spi_t * p_instance = &spi_bus_obj[index].spi;
|
nrfx_spi_t * p_instance = &spi_bus_obj[index].spi;
|
||||||
nrfx_spi_xfer_desc_t p_xfer_desc;
|
nrfx_spi_xfer_desc_t p_xfer_desc;
|
||||||
|
|
||||||
|
if(message->cs_take == 1)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_clear((uint32_t)device->parent.user_data);
|
||||||
|
}
|
||||||
|
p_xfer_desc.p_rx_buffer = message->recv_buf;
|
||||||
|
p_xfer_desc.rx_length = message->length;
|
||||||
|
p_xfer_desc.p_tx_buffer = message->send_buf;
|
||||||
|
p_xfer_desc.tx_length = message->length ;
|
||||||
if(message->send_buf == RT_NULL)
|
if(message->send_buf == RT_NULL)
|
||||||
{
|
{
|
||||||
p_xfer_desc.p_rx_buffer = message->recv_buf;
|
|
||||||
p_xfer_desc.rx_length = message->length;
|
|
||||||
|
|
||||||
p_xfer_desc.p_tx_buffer = RT_NULL;
|
|
||||||
p_xfer_desc.tx_length = 0;
|
p_xfer_desc.tx_length = 0;
|
||||||
}
|
}
|
||||||
|
if(message->recv_buf == RT_NULL)
|
||||||
|
{
|
||||||
|
p_xfer_desc.rx_length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nrf_ret = nrfx_spi_xfer(p_instance, &p_xfer_desc, 0);
|
||||||
|
if(message->cs_release == 1)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_set((uint32_t)device->parent.user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( NRFX_SUCCESS != nrf_ret)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p_xfer_desc.p_tx_buffer = message->send_buf;
|
return message->length;
|
||||||
p_xfer_desc.tx_length = message->length ;
|
|
||||||
|
|
||||||
p_xfer_desc.p_rx_buffer = RT_NULL;
|
|
||||||
p_xfer_desc.rx_length = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nrfx_err_t nrf_ret = nrfx_spi_xfer(p_instance, &p_xfer_desc, 0);
|
|
||||||
if( NRFX_SUCCESS == nrf_ret)
|
|
||||||
return message->length;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* spi bus callback function */
|
/* spi bus callback function */
|
||||||
|
@ -260,6 +273,7 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name,
|
||||||
{
|
{
|
||||||
RT_ASSERT(bus_name != RT_NULL);
|
RT_ASSERT(bus_name != RT_NULL);
|
||||||
RT_ASSERT(device_name != RT_NULL);
|
RT_ASSERT(device_name != RT_NULL);
|
||||||
|
RT_ASSERT(ss_pin != RT_NULL);
|
||||||
|
|
||||||
rt_err_t result;
|
rt_err_t result;
|
||||||
struct rt_spi_device *spi_device;
|
struct rt_spi_device *spi_device;
|
||||||
|
@ -267,8 +281,7 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name,
|
||||||
spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
|
spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
|
||||||
RT_ASSERT(spi_device != RT_NULL);
|
RT_ASSERT(spi_device != RT_NULL);
|
||||||
/* initialize the cs pin */
|
/* initialize the cs pin */
|
||||||
spi_device->user_data = (void*)ss_pin;
|
result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void*)ss_pin);
|
||||||
result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, RT_NULL);
|
|
||||||
if (result != RT_EOK)
|
if (result != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("%s attach to %s faild, %d", device_name, bus_name, result);
|
LOG_E("%s attach to %s faild, %d", device_name, bus_name, result);
|
||||||
|
@ -278,4 +291,5 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* BSP_USING_SPI0 || BSP_USING_SPI1 || BSP_USING_SPI2 */
|
||||||
#endif /*BSP_USING_SPI*/
|
#endif /*BSP_USING_SPI*/
|
||||||
|
|
Loading…
Reference in New Issue