做到STM32F429的SPI了,调了两天没调好
本来,STM32的SPI搞过很多的。这次开始用MX生成的东西,不工作(SCK等没有输出),后来又用以前可以工作的SPI代码,也不行,
没办法了,就看手册,一个寄存器一个寄存器地设置,结果仍然不工作。
示波器看不到SPI的任何波形。
这是现在设置的代码:
void SPI2_Init(void)
{
RCC->APB1ENR |= 1 << 14U; // SPI2 Clock EN
GPIOB->MODER &= 0x00FFFFFF;
GPIOB->MODER |= 0xA9000000; // PB12 GPIO_O, PB13,14,15 =AF
GPIOB->OTYPER &= 0xEFFF; // PB12 Output push-pull
GPIOB->PUPDR &= 0xFCFFFFFF; // PB12 No pull-up, pull-down
GPIOB->AFR[1] &= 0x000FFFFF; // Clear PB13,14,15
GPIOB->AFR[1] |= 0x55500000; // PB13,14,15 =AF5
__HAL_RCC_SPI2_CLK_ENABLE();
SPI2->CR1 = 0;
SPI2->CR2 = 0;
while ( SPI2->SR & 0x80 ){} // wait for not busy
SPI2->CR1 = /* 1 << 11 | Data frame format ###### 16bit */
/* 0 << 7 | Frame format, MSB transmitted first */
3 << 3 | /* Baud rate control, 1/16 ######### ------ APB1 37.5MHz , 1/16 = 2.343375MHz */
1 << 2 ; /* Master mode */
SPI2->I2SCFGR = 0; /* SPI mode */
SPI2->CR1 = 1<< 6 ; /* Enable */
}
此帖出自
小平头技术问答
GPIO所在的总线时钟有使能么?
一般来说,如果经常换cpu的话,虽然寄存器比较直观,为了程序的兼容性,我个人的看法是不建议用寄存器配置。http://bbs.eeworld.com.cn/thread-511356-1-1.html
还有看楼下,楼主的回复,您是用MX工具是吗? 这个的话,建议Cube库可以参考正点原子新出的阿波罗的例程的(库函数和寄存器都有的)。我没有下载429的手册
说明在的SPI2->CR1 |= 1<< 6这个操作,并没有使得CR1寄存器的第6位的SPI功能使能
我看到了你在7楼的回复。
是不是还是手册的问题,因为我之前记得你在有个帖子中,我们发现了,英文手册最新版本是支持F429的。
但是中文手册不行。。。
或者你可以这样试试:操作某一位之前,可以先通过按位与运算清零某一位,然后再通过按位或运算将某一位置位。
就是这样设置的。
本来,CR1的内容是0X1C,当置第六位时,应该成为0x5C才是,却变为0x18了,把MASTER位也清了。
一周热门 更多>