SPI发的数据最低位是1的话,MOSI发送后会一直置高

2019-07-20 07:31发布

stm32f302作主机,用spi3发数据,16位数据,CPHA=1按理说,MOSI在发完数据后应该是低电平,但是我用示波器观察,只要发的数据的最低位为1的话,如发xxxx xxxx xxxx xxx1,发完后MOSI就会一直置高。


我循环发0xfffe,最低位是0,可以看到,发送完后MOSI就置低了,正常。
IMG_011.jpg

然后改成0xffff,MOSI就一直是高了。
IMG_010.jpg

为了便于观察,我还试了发0x7776(0111 0111 0111 0110),最后一位是0,可以看到发送完后MOSI变为低电平,正常。
IMG_008.jpg

然后发0x7777(0111 0111 0111 0111),最后一位是1,发完后MOSI就一直置高。
IMG_009.jpg

附上spi配置与发送代码
static void Spi3Init(void)
{
        RCC->APB1ENR |= RCC_APB1RSTR_SPI3RST;//使能SPI3时钟

        GPIO_Set(SPI3_NSS_PORT,SPI3_NSS_PIN,MODER_OUT,PUPDR_NONE,OTYPER_PP,OSPEEDR_HIG);
        SPI3_NSS_PORT->BSRR |= 1<<SPI3_NSS_PIN;
       
        GPIO_Set(SPI3_SCK_PORT,SPI3_SCK_PIN,MODER_AF,PUPDR_NONE,OTYPER_PP,OSPEEDR_HIG);
        GPIO_AF_Set(SPI3_SCK_PORT,SPI3_SCK_PIN,6);
       
        GPIO_Set(SPI3_MISO_PORT,SPI3_MISO_PIN,MODER_AF,PUPDR_NONE,OTYPER_PP,OSPEEDR_HIG);
        GPIO_AF_Set(SPI3_MISO_PORT,SPI3_MISO_PIN,6);
       
        GPIO_Set(SPI3_MOSI_PORT,SPI3_MOSI_PIN,MODER_AF,PUPDR_NONE,OTYPER_PP,OSPEEDR_HIG);
        GPIO_AF_Set(SPI3_MOSI_PORT,SPI3_MOSI_PIN,6);
       
        SPI3->CR1 |= SPI_CR1_CPHA;//CPHA:1,CPOL:0
        SPI3->CR1 |= SPI_CR1_MSTR;//MSTR:1 主机
        SPI3->CR1 |= SPI_CR1_BR_0|SPI_CR1_BR_1|SPI_CR1_BR_2;//BR:111 波特率
        SPI3->CR1 |= SPI_CR1_SSM;//SSM:1
        SPI3->CR1 |= SPI_CR1_SSI;//SSI:1

        SPI3->CR2        |=        SPI_CR2_DS_0|SPI_CR2_DS_1|SPI_CR2_DS_2|SPI_CR2_DS_3;//DS:1111 16-bit
}


uint16_t NewSpiTransfer(uint16_t txData)
{
        while((SPI3->SR & SPI_SR_TXE)  == 0);//等待发送区空
        SPI3->DR=txData;//发送一个byte
       
     //while((SPI3->SR & SPI_SR_RXNE) == 0);//等待接收完一个byte
        return SPI3->DR;//返回收到的数据
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-20 10:50
 精彩回答 2  元偷偷看……
carvenl
2楼-- · 2019-07-20 11:26
正点原子 发表于 2018-6-26 22:19
没毛病,CPHA是控制时钟相位的,并不控制MOSI,或者MISO的高低电平。

我在CPHA=1后面应该有个换行,发出来就没了。您可能误解我的意思了,我只是希望MOSI在空闲的适合保持低电平。

一周热门 更多>