2026/4/14 17:59:12
网站建设
项目流程
做淘客网站备案,国产的主题wordpress,快速网页制作,做网站 网络映射数据手册官网上面
https://amac-chemnitz.com/index.php/en/products/interpolationsschaltkreise/93-gc-ip201b-en
STM32F103C8T6翻译后的是通信协议#xff1a;每个数据传输都通过主机处理器发送一个SPI字来启动。一个SPI字由4位操作码、4位硬件地址和最多8位数据组成。
只有…数据手册官网上面https://amac-chemnitz.com/index.php/en/products/interpolationsschaltkreise/93-gc-ip201b-enSTM32F103C8T6翻译后的是通信协议每个数据传输都通过主机处理器发送一个SPI字来启动。一个SPI字由4位操作码、4位硬件地址和最多8位数据组成。只有当发送的硬件地址与GC‑IP201(B)存储的硬件地址相匹配时操作码才会被接受。复位后IC具有硬件地址‘0000’。使用SETHWA命令可以将HWA3:0 的电压作为新的硬件地址写入IC。用于读取寄存器的操作码将在下一个SPI访问时将数据输出到MISO与新的SPI字中的硬件地址无关。对GC‑IP201(B)中的寄存器进行访问时以8位写入和16位读取方式进行。IC中的寄存器以32位组织。因此在IC中为读取操作实现了一个32位保持寄存器。待读取的数据通过SPI字RD0/ST传输到该保持寄存器。两个最低有效字节的数据输出到MISO是在下一个SPI周期期间进行的。两个最高有效字节的数据输出到MISO是在RD1字传输到MOSI后的SPI周期中进行的。通常读取32位寄存器时依次执行RD0/ST、RD1和NOP指令。连续读取多个寄存器时可以使用RD0–RD1–RD0–RD1…序列。写入寄存器时首先使用SPI字WRA设置寄存器地址然后可通过WRD进行描述。32位寄存器的写入是逐字节进行的。通信重点在读取寄存器时32位寄存器数据的传输与IC内部流程同步进行。通过CFG2寄存器中的SYNC值可以将时间点相对于ADC采样时间点进行偏移。这样就可以进行等间隔测量实现低延迟。同步等待期间MISO输出为低电平。如果CFG2寄存器中的ASYNC位被设置异步模式数据将在SEN信号的上升沿立即存储。与模拟信号的采样时间失去关联。因此可以实现更高的传输速度。对于读取MVAL、CNT、POSIT、STAT、CTRLG、CTRLO和ADC寄存器SYNC可以设置为任意值。默认值’00000’会导致计算计数值与SPI接口数据输出之间存在较小延迟。对于读取PHI、DPHI、BQ和CADC寄存器必须使用’00100’值。通过配置位CFG3/SPISLOW可以启用对SPI输入信号SEN,SCK和MOSI的数字滤波。此时SCK的最大SPI时钟频率将被限制在约fOSZ /4。如何控制呢HAL_GPIO_WritePin(GPIOA,NRES_REST_Pin,GPIO_PIN_RESET);//复位HAL_Delay(100);HAL_GPIO_WritePin(GPIOA,NRES_REST_Pin,GPIO_PIN_SET);我们先说写寄存器根据协议和驱动信号可以看到图15先写WRA,在写WRD。即可完成寄存器的写入。根据8.1.2WRA0x8000Adresse WRD0xA000Daten假如我们写CFG1寄存器地址0x0C. 根据SPI时序我们发0X8000 加上地址0x0C.所以我们写入的值是0x800C 一共16位SPI一次发16位。等待后根据时序我们需要发WRD也就是我们的数据这样我们就完成了一个0x0C寄存器的写入。实现代码HAL_StatusTypeDefGC_IP201_WriteReg(uint8_treg_addr,uint8_tdata){uint16_ttx_data;HAL_StatusTypeDef status;// 1. SEN拉低发送WRA(地址)HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_RESET);tx_data0x8000|(reg_addr0xFF);// WRA: 1000 0000 8位地址statusHAL_SPI_Transmit(hspi1,(uint8_t*)tx_data,1,100);HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_SET);if(status!HAL_OK){returnstatus;}// 短暂延时根据时序要求HAL_Delay(1);// 2. SEN再次拉低发送WRD(数据)HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_RESET);tx_data0xA000|(data0xFF);// WRD: 1010 0000 8位数据statusHAL_SPI_Transmit(hspi1,(uint8_t*)tx_data,1,100);HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_SET);returnstatus;}我们在说读寄存器根据图15读32位寄存器读取需要发送RD0和RD1和NOP。RD0是0xC00C。然后发送0xE000在发送0x0000。即可实现代码uint32_tGC_IP201_ReadReg(uint8_treg_addr){uint16_ttx_data;uint16_trx_low,rx_high;HAL_StatusTypeDef status;// 1. SEN拉低发送RD0(地址)HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_RESET);tx_data0xC000|(reg_addr0xFF);// RD0: 1100 0000 8位地址statusHAL_SPI_Transmit(hspi1,(uint8_t*)tx_data,1,100);HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_SET);if(status!HAL_OK){return0;}// 短暂延时HAL_Delay(1);// 2. SEN拉低发送RD1同时接收低16位数据HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_RESET);tx_data0xE000;// RD1: 1110 0000statusHAL_SPI_TransmitReceive(hspi1,(uint8_t*)tx_data,(uint8_t*)rx_low,1,100);HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_SET);if(status!HAL_OK){return0;}// 短暂延时HAL_Delay(1);// 3. SEN拉低发送NOP同时接收高16位数据HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_RESET);tx_data0x0000;// NOPstatusHAL_SPI_TransmitReceive(hspi1,(uint8_t*)tx_data,(uint8_t*)rx_high,1,100);HAL_GPIO_WritePin(SPI_NSS_GPIO_Port,SPI_NSS_Pin,GPIO_PIN_SET);if(status!HAL_OK){return0;}// 组合32位数据rx_high(高16位) rx_low(低16位)return((uint32_t)rx_high16)|rx_low;}此芯片一个寄存器是32位。写指定寄存器的32位。HAL_StatusTypeDefGC_IP201_WriteReg32(uint8_treg_addr,uint32_tdata){HAL_StatusTypeDef status;// 写入低8位statusGC_IP201_WriteReg(reg_addr,data0xFF);if(status!HAL_OK)returnstatus;// 写入次低8位statusGC_IP201_WriteReg(reg_addr1,(data8)0xFF);if(status!HAL_OK)returnstatus;// 写入次高8位statusGC_IP201_WriteReg(reg_addr2,(data16)0xFF);if(status!HAL_OK)returnstatus;// 写入高8位returnGC_IP201_WriteReg(reg_addr3,(data24)0xFF);}然后综上所述配置好相应的寄存器就可以正常使用该芯片了。