主模式示例
## 主模式示例
```language
/**
* @file spi_master_demo.c
* @ingroup peripheral
* @brief SPI主设备工作模式Demo
*
***********************************************************************************/
#include "softap_api.h"
#if DEMO_TEST
#include "xy_peripheral.h"
//these define are provide a modification for user
#define SPI_MOSI_PIN GPIO_PIN_NUM_6
#define SPI_MISO_PIN GPIO_PIN_NUM_7
#define SPI_SCLK_PIN GPIO_PIN_NUM_8
#define SPI_NSS1_PIN GPIO_PIN_NUM_9
#define SPI_NSS2_PIN GPIO_PIN_NUM_18
#define SPI_CLK_DIV SPI_CLK_DIV_16 //can use: 2 4 8 16 32 64 128 256
#define SPI_WORK_MODE SPI_WORK_MODE_0 //can use: 0 1 2 3
#define SPI_DATA_WIDTH SPI_DATA_WIDTH_8 //can use: 8 16 32
#define SPI_MASTER_TASK_PRIORITY 10
#define SPI_MASTER_STACK_SIZE 500
UINT32 g_spi_master_TskHandle = -1;
/**
* @brief SPI中断服务函数
* @code
* xy_SPI_ChipSelect(SPI1, SPI_NSS_PIN_1);
tmp = xy_SPI_RW_Data(SPI1, SPI_DATA_WIDTH, 0x5A);
xy_SPI_ChipSelect(SPI1, SPI_NSS_NONE);
xy_SPI_ChipSelect(SPI1, SPI_NSS_PIN_2);
tmp = xy_SPI_RW_Data(SPI1, SPI_DATA_WIDTH, 0xA5);
xy_SPI_ChipSelect(SPI1, SPI_NSS_NONE);
* @endcode
*
*/
void user_hook_spi_master_handler(void)
{
uint32_t tmp;
xy_SPI_ChipSelect(SPI1, SPI_NSS_PIN_1);
tmp = xy_SPI_RW_Data(SPI1, SPI_DATA_WIDTH, 0x5A);
xy_SPI_ChipSelect(SPI1, SPI_NSS_NONE);
xy_SPI_ChipSelect(SPI1, SPI_NSS_PIN_2);
tmp = xy_SPI_RW_Data(SPI1, SPI_DATA_WIDTH, 0xA5);
xy_SPI_ChipSelect(SPI1, SPI_NSS_NONE);
xy_sleep(10);
}
/**
* @brief SPI初始化函数
* @note 在配置IO前需要清空配置寄存器并开启外设时钟
*
* @code
* xy_PRCM_ClockCmd(PRCM_CKG_CTL_SPI1, ENABLE);
xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE);
xy_GPIO_ClearConfig(SPI_MISO_PIN);
xy_GPIO_ClearConfig(SPI_MOSI_PIN);
xy_GPIO_ClearConfig(SPI_SCLK_PIN);
xy_GPIO_ClearConfig(SPI_NSS1_PIN);
xy_GPIO_ClearConfig(SPI_NSS2_PIN);
xy_GPIO_Remapping(SPI_SCLK_PIN, REMAP_SPI_SCLK);
xy_GPIO_Remapping(SPI_MISO_PIN, REMAP_SPI_MISO);
xy_GPIO_Remapping(SPI_MOSI_PIN, REMAP_SPI_MOSI);
xy_GPIO_Remapping(SPI_NSS1_PIN, REMAP_SPI_NSS1);
xy_GPIO_Remapping(SPI_NSS2_PIN, REMAP_SPI_NSS2);
xy_GPIO_SetIOMode(SPI_SCLK_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_MISO_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_MOSI_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_NSS1_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_NSS2_PIN, GPIO_MODE_HW_PER);
xy_SPI_MasterInit(SPI1, SPI_CLK_DIV, SPI_WORK_MODE, SPI_DATA_WIDTH);
//xy_SPI_Delay_Set(SPI1, 0, 0, 0, 0);
xy_SPI_Cmd(SPI1, ENABLE);
* @endcode
*
*/
void spi_master_gpio_init(void)
{
xy_PRCM_ClockCmd(PRCM_CKG_CTL_SPI1, ENABLE);
xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE);
xy_GPIO_ClearConfig(SPI_MISO_PIN);
xy_GPIO_ClearConfig(SPI_MOSI_PIN);
xy_GPIO_ClearConfig(SPI_SCLK_PIN);
xy_GPIO_ClearConfig(SPI_NSS1_PIN);
xy_GPIO_ClearConfig(SPI_NSS2_PIN);
xy_GPIO_Remapping(SPI_SCLK_PIN, REMAP_SPI_SCLK);
xy_GPIO_Remapping(SPI_MISO_PIN, REMAP_SPI_MISO);
xy_GPIO_Remapping(SPI_MOSI_PIN, REMAP_SPI_MOSI);
xy_GPIO_Remapping(SPI_NSS1_PIN, REMAP_SPI_NSS1);
xy_GPIO_Remapping(SPI_NSS2_PIN, REMAP_SPI_NSS2);
xy_GPIO_SetIOMode(SPI_SCLK_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_MISO_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_MOSI_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_NSS1_PIN, GPIO_MODE_HW_PER);
xy_GPIO_SetIOMode(SPI_NSS2_PIN, GPIO_MODE_HW_PER);
xy_SPI_MasterInit(SPI1, SPI_CLK_DIV, SPI_WORK_MODE, SPI_DATA_WIDTH);
//xy_SPI_Delay_Set(SPI1, 0, 0, 0, 0);
xy_SPI_Cmd(SPI1, ENABLE);
}
/**
* @brief SPI工作函数
*
*/
void spi_master_work_task(void)
{
while(1)
{
user_hook_spi_master_handler();
}
}
/**
* @brief 这个函数为I2Cdemo提供了一个工作线程
*
* @return UINT32
*/
UINT32 spi_master_work_task_init(void)
{
UINT32 uwRet = LOS_NOK;
uwRet = xy_TaskCreate((TaskFunc_t)spi_master_work_task, "spi_master_work_task", SPI_MASTER_STACK_SIZE, NULL, SPI_MASTER_TASK_PRIORITY, &g_spi_master_TskHandle);
return uwRet;
}
#endif
```