打印
[N32G45x]

N32G45X芯片SPI1口读取异常

[复制链接]
1206|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jdz8888|  楼主 | 2022-10-28 20:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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设置的是哪几个引脚?硬件图也贴上来呗!

使用特权

评论回复
5
芯路例程| | 2022-11-3 16:34 | 只看该作者
看逻辑分析仪时钟线有信号,MISO和MOSI都没有信号。应该是配置有问题。

使用特权

评论回复
6
芯路例程| | 2022-11-3 16:35 | 只看该作者
你可以试试用GPIO控制MOSI引脚。

使用特权

评论回复
7
AloneKaven| | 2022-11-4 22:15 | 只看该作者
SPI设置的是哪几个引脚?

使用特权

评论回复
8
jdz8888|  楼主 | 2022-11-9 19:48 | 只看该作者
本帖最后由 jdz8888 于 2022-11-9 19:49 编辑

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

使用特权

评论回复
9
crazyguys| | 2022-11-10 09:30 | 只看该作者
jdz8888 发表于 2022-11-9 19:48
使用了N32G455REL7 的SPI1  PA4 (CS)  PA5(SCLK) PA6 (MISO) PA7 (MOSI) 几个引脚,程序开始是能个检测到AD7 ...

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

使用特权

评论回复
10
jdz8888|  楼主 | 2022-11-11 20:35 | 只看该作者
crazyguys 发表于 2022-11-10 09:30
会损坏IO口的吧,这几个引脚都是不耐5V的

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

使用特权

评论回复
11
jdz8888|  楼主 | 2022-11-11 20:51 | 只看该作者
今天又测试了一下,发现就是SPIX=1 时不行,代码如下:
#define SPIX    1

#if (SPIX==1)

#define WEIGHT_SPIx                SPI1   //    SPI2
#define WEIGHT_SPIx_APBxClock_FUN  RCC_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_FUN  RCC_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_FUN  RCC_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_FUN  RCC_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

使用特权

评论回复
12
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参数都不行

使用特权

评论回复
13
jobszheng| | 2023-3-19 13:05 | 只看该作者
最近也要使用N32G455和SPI外设。这个问题我也注意一下,否则这就太浪费时间了

使用特权

评论回复
14
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

主题

17

帖子

0

粉丝