STM32F417采用ZLG9518S通过SPI扩展串口,不通,请问有没有遇到相关情况的?请高手指导!谢谢!
1. ZLG9518S与STM32管脚映射: XM_RST GPIOB GPIO_Pin_0 XM_REN GPIOC GPIO_Pin_4 XM_IRQ GPIOC GPIO_Pin_5 XM_SCK XM_MOSI GPIOA GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 XM_MISO XM_CS GPIOA GPIO_Pin_4 2. 按照提供的测试例程,有正常的方波输出 3. ZLG9518s和STM32的SPI初始化 Void BringVision_SPI_Init() { GPIO_InitTypeDefGPIO_InitStructure; SPI_InitTypeDefSPI_InitStructure; //复位ZLG9518S----------------------1.复位ZLG9518S RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOF时钟 //GPIOB0初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOB GPIO_ResetBits(GPIOB,GPIO_Pin_0); //拉低复位管脚,复位ZLG9518S //GPIOFB5,6,7设置成高组态,即输入----2.设置SPI为输入 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 //GPIOFC4,ZLG9518s的REN管脚----------3.设置REN为输入,IRQ为输入 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5;//PC4功能输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化 //CS---------------------------------4.初始化CS为输出,并拉高CS片选 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);// GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4; //PA4 GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT; //输出 GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PAout(4)= 1; //ZLG9518S片选拉高 //-----------------------------------5.释放ZLG9518S复位 GPIO_SetBits(GPIOB,GPIO_Pin_0); //延时500ms以上----------------------6.等待至少500ms delay_ms(600); //GPIOFB3,4,5初始化设置--SPI---------7.开始正常初始化SPI操作 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//使能SPI1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PB3~5复用功能输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);//PB5复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);//PB6复用为 SPI1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);//PB7复用为 SPI1 //这里只针对SPI口初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE); //复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode =SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL =SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS =SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler= SPI_BaudRatePrescaler_16; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1,&SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI1,ENABLE); //使能SPI外设 //8.拉低CS,并一直保持拉低状态,后续操作一直保持为0不变 PAout(4) = 0; } 4. 串口操作 1) voids2u_configure_one_uart(uint8_t uart_chan) { uint16_t cmd_buf[2]; uint8_t data; data =S2UC_LCR1_PUT_BAUD_BIT(S2UC_LCR1_BAUD_115200) | S2UC_LCR1_PUT_CTS_BIT(S2UC_LCR1_CTS_ON) | S2UC_LCR1_PUT_RTS_BIT(S2UC_LCR1_RTS_ON) |S2UC_LCR1_PUT_FIFO_ENINT_BIT(S2UC_LCR1_INT_DIS) | S2UC_LCR1_PUT_STREAM_ENINT_BIT(S2UC_LCR1_INT_EN) |S2UC_LCR1_PUT_ERR_ENINT_BIT(S2UC_LCR1_INT_DIS); zlg9518s_send_write_cmd(ZLG9518S_LCR1_REG,uart_chan, data, cmd_buf); data = S2UC_LCR0_PUT_STATE_BIT(S2UC_LCR0_ON_STATE) | S2UC_LCR0_PUT_DLEN_BIT(S2UC_LCR0_8_BIT_DATA) | S2UC_LCR0_PUT_PARITY_BIT(S2UC_LCR0_PARITY_NONE) | S2UC_LCR0_PUT_STOP_BIT(S2UC_LCR0_STOP_1_BIT); zlg9518s_send_write_cmd(ZLG9518S_LCRO_REG,uart_chan, data, cmd_buf); data =S2UC_TCR_PUT_STREAM_START_BIT(S2UC_TCR_STREAM_32_BYTE_MAX255) |S2UC_TCR_PUT_STREAM_END_BIT(S2UC_TCR_STREAM_224_BYTE_MAX255); zlg9518s_send_write_cmd(ZLG9518S_TCR_REG,uart_chan, data, cmd_buf); data =S2UC_TLR_PUT_RFIFO_INT_BIT(S2UC_TCR_STREAM_224_BYTE_MAX255) |S2UC_TLR_PUT_TFIFO_INT_BIT(S2UC_TCR_STREAM_240_BYTE_MAX255); zlg9518s_send_write_cmd(ZLG9518S_TLR_REG,uart_chan, data, cmd_buf); } 2) voids2u_send_data_one_uart(uint8_t uart_chan) { uint16_t cmd_buf[2]; uint8_t data; for (data = 0; data < 255; data++) { zlg9518s_send_write_cmd(ZLG9518S_THR_REG,uart_chan, data, cmd_buf); } } 3)操作流程 BringVision_SPI_Init(); s2u_configure_one_uart(UART_CHAN_0); s2u_send_data_one_uart (UART_CHAN_0);
|