初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2017-11-21
- 在线时间
- 17 小时
|
求助论坛里的大神。该系统设计两个MCU:STM32F103和NRF51822。两者之间通过SPI通讯接口进行通讯。STM32作为从机通过中断的方式接收nrf发来的数据,这一功能已经实现。目前stm32端有数据想发送至nrf端,目前实现这个功能小弟想请教下原子哥和论坛大大们。
1、SPI时钟由主机nrf51822提供,所以我是这个设计的:
将一个空闲IO口作为stm32往nrf51822端发送数据的标志。该IO口一直保持高电平,stm32端有数据发送时,stm32将此IO拉低,nrf51822判别该IO口被拉低了,nrf发送无效数据读取stm32端的数据。小弟调试之后发现比如:stm32端发送数据为A,nrf51822端接收数据有可能是0xA0,0xA,0x82,0x14等0xa移位的数据。
在此请教下,论坛大大们,这样的方式可行不可行?还有,nrf端收到移位的数据这个跟什么配置有关系,该如何解决?
下面是stm32 spi slave配置:
void SPI_slave(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//Enable SPI2 clock and GPIO clock for SPI2 and SPI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/*
13 ---- SCK
12 ---- NSS
14 ---- MISO
15 ---- MOSI
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//1st phase: SPI2 slave
//SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//Ôúμú¶t¸öÑØ½øDD2éÑù
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
SPI_Cmd(SPI2, ENABLE);
/* Enable SPI2 RXNE interrupt */
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
}
nrf51822端spi配置代码如下所示:
uint32_t* spi_master_init(SPIModuleNumber module_number, SPIMode mode, bool lsb_first)
{
uint32_t config_mode;
NRF_SPI_Type *spi_base_address = (SPI0 == module_number)? NRF_SPI0 : (NRF_SPI_Type *)NRF_SPI1;
if(SPI0 == module_number)
{
/* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */
nrf_gpio_cfg_output(SPI_PSELSCK0);
nrf_gpio_cfg_output(SPI_PSELMOSI0);
nrf_gpio_cfg_input(SPI_PSELMISO0, NRF_GPIO_PIN_NOPULL);
nrf_gpio_cfg_output(SPI_PSELSS0);
/* Configure pins, frequency and mode */
spi_base_address->PSELSCK = SPI_PSELSCK0;
spi_base_address->PSELMOSI = SPI_PSELMOSI0;
spi_base_address->PSELMISO = SPI_PSELMISO0;
nrf_gpio_pin_set(SPI_PSELSS0); /* disable Set slave select (inactive high) */
}
else
{
/* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI1*/
nrf_gpio_cfg_output(SPI_PSELSCK1);
nrf_gpio_cfg_output(SPI_PSELMOSI1);
nrf_gpio_cfg_input(SPI_PSELMISO1, NRF_GPIO_PIN_NOPULL);
nrf_gpio_cfg_output(SPI_PSELSS1);
/* Configure pins, frequency and mode */
spi_base_address->PSELSCK = SPI_PSELSCK1;
spi_base_address->PSELMOSI = SPI_PSELMOSI1;
spi_base_address->PSELMISO = SPI_PSELMISO1;
nrf_gpio_pin_set(SPI_PSELSS1); /* disable Set slave select (inactive high) */
}
spi_base_address->FREQUENCY = (uint32_t) SPI_OPERATING_FREQUENCY;
/*lint -e845 -save // A zero has been given as right argument to operator '!'" */
/** @snippet [SPI Select mode] */
switch (mode )
{
//ËÄÖÖSPIÄ£ê½
case SPI_MODE0:
config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
break;
case SPI_MODE1:
config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
break;
case SPI_MODE2:
config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
break;
case SPI_MODE3:
config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
break;
default:
config_mode = 0;
break;
}
/*add by hss*/
bool ret1;
// SPI1 3õê¼»ˉ
ret1 = spi1_init(SPI1,0); /** test with shift Msb first mode 0 £¬óëstm32μÄSPIÅäÖÃò»Ñù*/
if(!ret1)
{
return false;
}
/*end by hss*/
|
|