未验证 提交 a3b02771 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #4008 from xckhmf/master

[bsp/nrf5x]fixed spi driver bugs
...@@ -6,6 +6,7 @@ ...@@ -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 @@ ...@@ -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, ...@@ -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 * ...@@ -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;
} }
else if(message->recv_buf == RT_NULL)
{ {
p_xfer_desc.p_tx_buffer = message->send_buf; p_xfer_desc.rx_length = 0;
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); nrf_ret = nrfx_spi_xfer(p_instance, &p_xfer_desc, 0);
if( NRFX_SUCCESS == nrf_ret) if(message->cs_release == 1)
return message->length; {
else nrf_gpio_pin_set((uint32_t)device->parent.user_data);
}
if( NRFX_SUCCESS != nrf_ret)
{
return 0; return 0;
}
else
{
return message->length;
}
} }
/* 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, ...@@ -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, ...@@ -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, ...@@ -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*/
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册