wenyangzeng 发表于 2019-8-26 16:18:04

scfor123456 发表于 2019-8-26 16:06
如何确定起始位?

至少应该规定一个握手信号,表示主机1帧数据发送开始,从机接收到握手信号后紧跟着是数据

scfor123456 发表于 2019-8-26 16:31:45

wenyangzeng 发表于 2019-8-26 16:18
至少应该规定一个握手信号,表示主机1帧数据发送开始,从机接收到握手信号后紧跟着是数据 ...

握手信号是通过软件给,还是硬件给?

wenyangzeng 发表于 2019-8-26 19:11:29

scfor123456 发表于 2019-8-26 16:31
握手信号是通过软件给,还是硬件给?

在软件里完成,在你发送数据开始之前先发送一字节特定码,比如0x55aa,接下去才是数据字节,这样就能够让主、从机同步。

scfor123456 发表于 2019-8-27 18:39:11

wenyangzeng 发表于 2019-8-26 19:11
在软件里完成,在你发送数据开始之前先发送一字节特定码,比如0x55aa,接下去才是数据字节,这样就能够让 ...
我现在加了NSS引脚,用TI模式,通讯收发数据波形正确,但通过仿真读出的内存值不正确。比如我主机一次发 1,2,3,4,5,-1,-2,-3,-4,-5,从机接收到后再原数据发送回来,主机的收发引脚数据波形如下,但内存地址显示数据为0,0,65535,65535,32764,65532,32761,32768,0,1。

scfor123456 发表于 2019-8-27 18:46:17

这个到底是怎么回事?

wenyangzeng 发表于 2019-8-27 19:09:50

scfor123456 发表于 2019-8-27 18:46
这个到底是怎么回事?
楼主那个SPI每次发送1个字节的无符号整数,如何发送有符号的数呢?

scfor123456 发表于 2019-8-28 08:52:07

wenyangzeng 发表于 2019-8-27 19:09
楼主那个SPI每次发送1个字节的无符号整数,如何发送有符号的数呢?

我发的是16位数据

uwyciw100 发表于 2019-8-28 11:27:49

做过一次SPI从设备。当时是配置从设备使用NSS,和DMA。两者都要使用,才能正常工作。

scfor123456 发表于 2019-8-28 15:17:10

uwyciw100 发表于 2019-8-28 11:27
做过一次SPI从设备。当时是配置从设备使用NSS,和DMA。两者都要使用,才能正常工作。 ...

#define FUNCTION_TO_MOTOR_NUM_MAX 10
#define MOTOR_TO_FUNCTION_NUM_MAX 10

uint8_t gSendToMotorDataBuff1;
uint8_t gSendToFunctionDataBuff1={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

/**
* @briefGPIO的初始化配置函数
* @param无
* @retval 无
*/
void spi2_Init(void)
{
        spi2_dma1_init();
       
   /* Enable the peripheral clock SPI2 */
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;

/* Configure SPI2 in slave */
/* nSS hard, slave, CPOL and CPHA at zero (rising first edge) */
/* (1) TX and RX with DMA, RXNE IT, 8-bit Rx fifo */
/* (2) Enable SPI2 */
SPI2->CR2 = SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN | SPI_CR2_RXNEIE | SPI_CR2_FRXTH | SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0|SPI_CR2_FRF; /* (1) */
SPI2->CR1 |= SPI_CR1_SPE; /* (2) */       
               
}

void spi2_dma1_init(void)
{
/* Enable the peripheral clock DMA11 */
RCC->AHBENR |= RCC_AHBENR_DMA1EN;

/* DMA1 Channel4 SPI2_RX config */
/* (1) Peripheral address */
/* (2) Memory address */
/* (3) Data size */
/* (4) Memory increment */
/*   Peripheral to memory */
/*   8-bit transfer */
/*   Transfer complete IT */
DMA1_Channel4->CPAR = (uint32_t)&(SPI2->DR); /* (1) */
DMA1_Channel4->CMAR = (uint32_t)gSendToMotorDataBuff1; /* (2) */
DMA1_Channel4->CNDTR = FUNCTION_TO_MOTOR_NUM_MAX; /* (3) */
DMA1_Channel4->CCR |= DMA_CCR_MINC | DMA_CCR_TCIE| DMA_CCR_EN; /* (4) */

/* DMA1 Channel5 SPI2_TX config */
/* (5) Peripheral address */
/* (6) Memory address */
/* (7) Memory increment */
/*   Memory to peripheral*/
/*   8-bit transfer */
DMA1_Channel5->CPAR = (uint32_t)&(SPI2->DR); /* (5) */
DMA1_Channel5->CMAR = (uint32_t)gSendToFunctionDataBuff1; /* (6) */
DMA1_Channel5->CCR |= DMA_CCR_MINC | DMA_CCR_DIR; /* (7) */
DMA1_Channel5->CNDTR = MOTOR_TO_FUNCTION_NUM_MAX; /* Data size */
DMA1_Channel5->CCR |= DMA_CCR_EN;       
       
/* Configure IT */
/* (8) Set priority for DMA1_Channel4_IRQn */
/* (9) Enable DMA1_Channel4_IRQn */
NVIC_SetPriority(DMA1_Channel4_IRQn, 0); /* (8) */
NVIC_EnableIRQ(DMA1_Channel4_IRQn); /* (9) */
       
}

/**
* @briefThis function handles DMA1 channel 4 TC interrupt request.
* @paramNone
* @retval None
*/
void DMA1_Channel4_IRQHandler(void)
{
if((DMA1->ISR & DMA_ISR_TCIF4) == DMA_ISR_TCIF4)
{
    DMA1->IFCR |= DMA_IFCR_CTCIF4; /* Clear TC flag */
   
    DMA1_Channel4->CCR &=~ DMA_CCR_EN;
        DMA1_Channel4->CMAR = (uint32_t)gSendToMotorDataBuff1; /* (2) */
    DMA1_Channel4->CNDTR = FUNCTION_TO_MOTOR_NUM_MAX; /* Data size */
    DMA1_Channel4->CCR |= DMA_CCR_EN;
               
        spi2_send_data();
}
}



void spi2_send_data(void)
{
        uint8_t i;
        gSendToFunctionDataBuff1=gSendToMotorDataBuff1;
        for(i=1;i<MOTOR_TO_FUNCTION_NUM_MAX;i++)
        {
                gSendToFunctionDataBuff1=gSendToMotorDataBuff1;
        }
/* start 16-bit transmission with DMA*/
/* Prepare Slave */
DMA1_Channel5->CCR &=~ DMA_CCR_EN;
DMA1_Channel5->CMAR = (uint32_t)gSendToFunctionDataBuff1; /* (6) */
DMA1_Channel5->CNDTR = MOTOR_TO_FUNCTION_NUM_MAX; /* Data size */
DMA1_Channel5->CCR |= DMA_CCR_EN;       

}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
请帮我看看从机的处理,DMA接收中断中更新下次需发送的数据,主机是定时发送10个数据,从机接收后元数据返回给主机。
页: 1 [2]
查看完整版本: 双MCU通过SPI DMA发送接收数据有错误