jdz8888 发表于 2022-10-28 20:28

N32G45X芯片SPI1口读取异常

N32G45X芯片SPI1异常
开发一个称量项目用到了N32G455REL7 通过SPI1读取AD7190的ADC转换值,开始调试时,SPI1口读取AD7190芯片的ID值,芯片内温度都很正常,一次断电后,发现在再也读不到AD芯片了,以为是AD芯片坏了,换几片AD都不行,再换N32G455REL7也是不行,修改配置,一直折腾了好几天都没有一个结果,换STM32芯片,读取正常,后再换N32G455REEL7的SPI2口读取AD芯片的ID,结果正常,反过来再换SPI1口还是不正常。用逻辑分析仪抓包结果如下图,请大家分析如何修改?

void MX_WEIGHT_SPI_Init(void)
{
GPIO_InitTypeGPIO_InitStructure;
SPI_InitTypeSPI_InitStructure;
WEIGHT_SPIx_APBxClock_FUN(WEIGHT_SPIx_CLK, ENABLE);
RCC_EnableAPB2PeriphClk(WEIGHT_GPIO_CLK, ENABLE);
WEIGHT_CS_DISABLE();
GPIO_InitStructure.Pin = WEIGHT_CS_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitPeripheral (WEIGHT_CS_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pin = WEIGHT_SCK_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(WEIGHT_SCK_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pin = WEIGHT_MOSI_Pin;
GPIO_InitPeripheral(WEIGHT_MOSI_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pin = WEIGHT_MISO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(WEIGHT_MISO_GPIO_Port, &GPIO_InitStructure);
SPI_InitStructure.DataDirection   = SPI_DIR_DOUBLELINE_FULLDUPLEX;
SPI_InitStructure.SpiMode   = SPI_MODE_MASTER;
SPI_InitStructure.DataLen=SPI_DATA_SIZE_8BITS ;
SPI_InitStructure.CLKPOL= SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA= SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS   = SPI_NSS_SOFT ;
SPI_InitStructure.BaudRatePres= SPI_BR_PRESCALER_128;
SPI_InitStructure.FirstBit   = SPI_FB_MSB;
SPI_InitStructure.CRCPoly= 10;
SPI_Init(WEIGHT_SPIx , &SPI_InitStructure);
/* 使能SPI外设*/
SPI_Enable(WEIGHT_SPIx , ENABLE);
WEIGHT_CS_ENABLE();
}

sy12138 发表于 2022-10-31 10:45

用SPI1的其他IO口试一下,要注意有几个IO口比较特殊,例如PB3PB4都是Jtag脚,需要释放出来

jdz8888 发表于 2022-11-3 09:25

SPI的别映射引脚可用

软核硬核 发表于 2022-11-3 16:34

SPI设置的是哪几个引脚?硬件图也贴上来呗!

芯路例程 发表于 2022-11-3 16:34

看逻辑分析仪时钟线有信号,MISO和MOSI都没有信号。应该是配置有问题。

芯路例程 发表于 2022-11-3 16:35

你可以试试用GPIO控制MOSI引脚。

AloneKaven 发表于 2022-11-4 22:15

SPI设置的是哪几个引脚?

jdz8888 发表于 2022-11-9 19:48

本帖最后由 jdz8888 于 2022-11-9 19:49 编辑

使用了N32G455REL7 的SPI1PA4 (CS)PA5(SCLK) PA6 (MISO) PA7 (MOSI) 几个引脚,程序开始是能个检测到AD7190的,后来是因AD7190的COM脚接地,觉得不妥,就割断悬空了,从此就读不出来了,换个板也不行,恢复COM接地也不行,芯片不坏,用STM32F10RC可读写AD7190,所以搞不懂了,另外AD7190是5V工作电压,SPI驱动线上串了一个10欧姆的电阻,奇怪啊

crazyguys 发表于 2022-11-10 09:30

jdz8888 发表于 2022-11-9 19:48
使用了N32G455REL7 的SPI1PA4 (CS)PA5(SCLK) PA6 (MISO) PA7 (MOSI) 几个引脚,程序开始是能个检测到AD7 ...

会损坏IO口的吧,这几个引脚都是不耐5V的

jdz8888 发表于 2022-11-11 20:35

crazyguys 发表于 2022-11-10 09:30
会损坏IO口的吧,这几个引脚都是不耐5V的

有可能吧,不清楚IO内部到底如何,但作为普通IO口用是没有问题的

jdz8888 发表于 2022-11-11 20:51

今天又测试了一下,发现就是SPIX=1 时不行,代码如下:
#define SPIX    1

#if (SPIX==1)

#define WEIGHT_SPIx                SPI1   //    SPI2
#define WEIGHT_SPIx_APBxClock_FUNRCC_EnableAPB2PeriphClk//      RCC_EnableAPB1PeriphClk //
#define WEIGHT_SPIx_CLK            RCC_APB2_PERIPH_SPI1   //      RCC_APB1_PERIPH_SPI2
   
#define WEIGHT_GPIO_CLK            RCC_APB2_PERIPH_GPIOA    //      RCC_APB2_PERIPH_GPIOB
#define WEIGHT_CS_Pin            GPIO_PIN_4//GPIO_PIN_12
#define WEIGHT_CS_GPIO_Port      GPIOA      //GPIOB
#define WEIGHT_SCK_Pin             GPIO_PIN_5 //GPIO_PIN_13
#define WEIGHT_SCK_GPIO_Port       GPIOA       //GPIOB
#define WEIGHT_MISO_Pin            GPIO_PIN_6//GPIO_PIN_14
#define WEIGHT_MISO_GPIO_Port      GPIOA      //GPIOB
#define WEIGHT_MOSI_Pin            GPIO_PIN_7//GPIO_PIN_15
#define WEIGHT_MOSI_GPIO_Port      GPIOA      //GPIOB


#endif

#if (SPIX==2)
#define WEIGHT_SPIx                SPI1   //    SPI2
#define WEIGHT_SPIx_APBxClock_FUNRCC_EnableAPB2PeriphClk//      RCC_EnableAPB1PeriphClk //
#define WEIGHT_SPIx_CLK            RCC_APB2_PERIPH_SPI1   //      RCC_APB1_PERIPH_SPI2
   
#define WEIGHT_GPIO_CLK            RCC_APB2_PERIPH_GPIOA    //      RCC_APB2_PERIPH_GPIOB
#define WEIGHT_CS_Pin            GPIO_PIN_15//GPIO_PIN_12
#define WEIGHT_CS_GPIO_Port      GPIOA      //GPIOB
#define WEIGHT_SCK_Pin             GPIO_PIN_3 //GPIO_PIN_13
#define WEIGHT_SCK_GPIO_Port       GPIOB       //GPIOB
#define WEIGHT_MISO_Pin            GPIO_PIN_4//GPIO_PIN_14
#define WEIGHT_MISO_GPIO_Port      GPIOB      //GPIOB
#define WEIGHT_MOSI_Pin            GPIO_PIN_5//GPIO_PIN_15
#define WEIGHT_MOSI_GPIO_Port      GPIOB      //GPIOB

#endif
#if (SPIX==3)

#define WEIGHT_SPIx                SPI1   //    SPI2
#define WEIGHT_SPIx_APBxClock_FUNRCC_EnableAPB2PeriphClk//      RCC_EnableAPB1PeriphClk //
#define WEIGHT_SPIx_CLK            RCC_APB2_PERIPH_SPI1   //      RCC_APB1_PERIPH_SPI2
   
#define WEIGHT_GPIO_CLK            RCC_APB2_PERIPH_GPIOB    //      RCC_APB2_PERIPH_GPIOB
#define WEIGHT_CS_Pin            GPIO_PIN_2//GPIO_PIN_12
#define WEIGHT_CS_GPIO_Port      GPIOB      //GPIOB
#define WEIGHT_SCK_Pin             GPIO_PIN_7 //GPIO_PIN_13
#define WEIGHT_SCK_GPIO_Port       GPIOE       //GPIOB
#define WEIGHT_MISO_Pin            GPIO_PIN_8//GPIO_PIN_14
#define WEIGHT_MISO_GPIO_Port      GPIOE      //GPIOB
#define WEIGHT_MOSI_Pin            GPIO_PIN_9//GPIO_PIN_15
#define WEIGHT_MOSI_GPIO_Port      GPIOE      //GPIOB

#endif
#if (SPIX==4)

#define WEIGHT_SPIx                SPI2
#define WEIGHT_SPIx_APBxClock_FUNRCC_EnableAPB1PeriphClk //
#define WEIGHT_SPIx_CLK            RCC_APB1_PERIPH_SPI2
   
#define WEIGHT_GPIO_CLK            RCC_APB2_PERIPH_GPIOB    //      RCC_APB2_PERIPH_GPIOB
#define WEIGHT_CS_Pin            GPIO_PIN_12
#define WEIGHT_CS_GPIO_Port      GPIOB
#define WEIGHT_SCK_Pin             GPIO_PIN_13
#define WEIGHT_SCK_GPIO_Port       GPIOB
#define WEIGHT_MISO_Pin            GPIO_PIN_14
#define WEIGHT_MISO_GPIO_Port      GPIOB
#define WEIGHT_MOSI_Pin            GPIO_PIN_15
#define WEIGHT_MOSI_GPIO_Port      GPIOB
#endif

lovelessing 发表于 2023-3-19 09:54

我也是一样的问题,用N32怎么都不行,一开始用的硬件SPI,读ID第一次一直报错0xX4,后面循环再读才行,然后大循环里面读取ADC也一直是0xFF,因为读取的时候MOSI一直是高电平,后来换成0x00又一直读到0x00,换成什么读出来什么,偶尔读错一位数据一直乱跳,感觉极其不稳定,极性和跳变沿、MSB、分频系数所有的参数都测试过了,全都不行,根本读不到电压变化,实在没办法用ST就读出来了,一样的程序,又用N32G452换成IO模拟就又可以读到ID和正确的ADC了,示波器看波形发现SCK和MOSI、MISO是一起跳变的,放大多少倍几乎都看不到时间间隔,也就是一开始读到的数据根本没来得急有时间间隔就读下次了,难怪读的时候发出的是啥读到的基本上就差不多几个固定的数字,看了几十遍7190手册,sck跳变沿到MOSI跳变沿之间也必须有至少100ns的T3,用IO模拟就完全够了,也看得出时钟和数据跳变沿的时间差,不知道这个是不是硬件SPI的BUG,以前调SPI的屏幕也是这样,硬件的SPI无论如何改SPI参数都不行

jobszheng 发表于 2023-3-19 13:05

最近也要使用N32G455和SPI外设。这个问题我也注意一下,否则这就太浪费时间了

slot867 发表于 2024-1-31 10:12

国产平替 fully compatible. 板子拿来,换个芯片,性能更佳。MCU不用改 c code。

平替ADI芯片
SIG7190 平替 AD7190
SIG7192 平替 AD7192
SIG7193 平替 AD7193

平替Cirrus Logic芯片
SIG5532B 平替 CS5532BS(32-bit)
SIG5534B 平替 CS5534BS(32-bit)
SIG5532A 平替 CS5532AS(24-bit)
SIG5534A 平替 CS5534AS(24-bit)
SIG5530 平替 CS5530 (24-bit)
SIG5530B 平替 CS5530(32-bit)

平替ADI芯片
SIG7792 平替 AD7792
SIG7793 平替 AD7793
SIG7794 平替 AD7794
SIG7795 平替 AD7795
SIG7796 平替 AD7796
SIG7797 平替 AD7797
SIG7798 平替 AD7798
SIG7799 平替 AD7799

平替TI芯片
SIG1230A 平替 ADS1230 (20-bit)
SIG1232A 平替 ADS1232 (24-bit)

功能替代TI芯片
SIG24130/SIG24131/SIG24132 替代 ADS1220、ADS1247、ADS1248
SIG16130/SIG16131/SIG16132 替代 ADS1120、ADS1147、ADS1148
页: [1]
查看完整版本: N32G45X芯片SPI1口读取异常