stm32f302作主机,用spi3发数据,16位数据,CPHA=1按理说,MOSI在发完数据后应该是低电平,但是我用示波器观察,只要发的数据的最低位为1的话,如发xxxx xxxx xxxx xxx1,发完后MOSI就会一直置高。
我循环发0xfffe,最低位是0,可以看到,发送完后MOSI就置低了,正常。
然后改成0xffff,MOSI就一直是高了。
为了便于观察,我还试了发0x7776(0111 0111 0111 0110),最后一位是0,可以看到发送完后MOSI变为低电平,正常。
然后发0x7777(0111 0111 0111 0111),最后一位是1,发完后MOSI就一直置高。
附上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;//返回收到的数据
}
我在CPHA=1后面应该有个换行,发出来就没了。您可能误解我的意思了,我只是希望MOSI在空闲的适合保持低电平。
一周热门 更多>