项目中经常会用到多路spi,但是各路的配置又不尽相同,其中spi3默认状态是jlink模式,所以如果想正常使用spi3,就需要对其重映射。下面给出spi2和spi3的配置程序,该配置已验证。
验证mcu:stm32f107
1、spi2配置
void spi_init(void)
{
uint32_t cnt;
gpio_inittypedef gpio_initstructure;
spi_inittypedef spi_initstructure;
/* 使能 spi2 时钟 */
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob | rcc_apb2periph_gpioe, enable);
rcc_apb1periphclockcmd(rcc_apb1periph_spi2,enable);
/* ---------通信i/o初始化----------------
* pb13-spi2-sck
* pb14-spi2-miso
* pb15-spi2-mosi
*/
gpio_initstructure.gpio_pin = gpio_pin_13 | gpio_pin_14 | gpio_pin_15;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; // 复用输出
gpio_init(gpiob, &gpio_initstructure);
/* -------- 片选i/o初始化----------------*/
/* pb12-spi2-nss:enc28j60_cs */
gpio_initstructure.gpio_pin = gpio_pin_12;
gpio_initstructure.gpio_speed = gpio_speed_10mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; // 推挽输出
gpio_init(gpiob, &gpio_initstructure);
gpio_setbits(gpiob, gpio_pin_12); // 先把片选拉高,真正用的时候再拉低
/* ---------复位i/o初始化----------------*/
/* pe6_rst */
gpio_initstructure.gpio_pin = gpio_pin_6;
gpio_initstructure.gpio_speed = gpio_speed_10mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; // 推挽输出
gpio_init(gpioe, &gpio_initstructure);
gpio_setbits(gpioe, gpio_pin_6);// 先把复位拉高,真正用的时候再拉低复位
/* spi2 配置 */
spi_initstructure.spi_direction = spi_direction_2lines_fullduplex;
spi_initstructure.spi_mode = spi_mode_master;
spi_initstructure.spi_datasize = spi_datasize_8b;
spi_initstructure.spi_cpol = spi_cpol_low;
spi_initstructure.spi_cpha = spi_cpha_1edge;
spi_initstructure.spi_nss = spi_nss_soft;
spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_8;
spi_initstructure.spi_firstbit = spi_firstbit_msb;
spi_initstructure.spi_crcpolynomial = 7;
spi_init(spi2, &spi_initstructure);
/* 使能 spi2 */
spi_cmd(spi2, enable);
}
2、spi3配置
需要注意的是:
(1)开启afio时钟: rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable);
(2)使能swd :gpio_pinremapconfig(gpio_remap_swj_jtagdisable,enable) ;
void spi3_init(void)
{
gpio_inittypedef gpio_initstructure;
spi_inittypedef spi_initstructure;
/* 使能 spi3时钟 */
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob | rcc_apb2periph_gpioa | rcc_apb2periph_gpioc, enable);
rcc_apb1periphclockcmd(rcc_apb1periph_spi3,enable);
rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable);
gpio_pinremapconfig(gpio_remap_swj_jtagdisable,enable) ;
/* ---------通信i/o初始化----------------
* pb3-spi3-sck
* pb4-spi3-miso
* pb5-spi3-mosi
*/
gpio_initstructure.gpio_pin = gpio_pin_3| gpio_pin_4 | gpio_pin_5;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; // 复用输出
gpio_init(gpiob, &gpio_initstructure);
/* --------- 片选i/o初始化----------------*/
/* pb12-spi2-nss:enc28j60_cs */
gpio_initstructure.gpio_pin = gpio_pin_15;
gpio_initstructure.gpio_speed = gpio_speed_10mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; // 推挽输出 gpio_mode_out_pp
gpio_init(gpioa, &gpio_initstructure);
gpio_setbits(gpioa, gpio_pin_15); // 先把片选拉高,真正用的时候再拉低
/* ---------复位i/o初始化----------------*/
/* pe6-enc28j60_rst */ //复位引脚
gpio_initstructure.gpio_pin = gpio_pin_9;
gpio_initstructure.gpio_speed = gpio_speed_10mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; // 推挽输出
gpio_init(gpioc, &gpio_initstructure);
gpio_setbits(gpioc, gpio_pin_9); // 先把复位拉高,真正用的时候再拉低复位
/* spi3 配置 */
spi_initstructure.spi_direction = spi_direction_2lines_fullduplex;
spi_initstructure.spi_mode = spi_mode_master;
spi_initstructure.spi_datasize = spi_datasize_8b;
spi_initstructure.spi_cpol = spi_cpol_low;
spi_initstructure.spi_cpha = spi_cpha_1edge;
spi_initstructure.spi_nss = spi_nss_soft;
spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_8;
spi_initstructure.spi_firstbit = spi_firstbit_msb;
spi_initstructure.spi_crcpolynomial = 7;
spi_init(spi3, &spi_initstructure);
/* 使能 spi3 */
spi_cmd(spi3, enable);
}
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』