|
調試過程中遇到的問題:
最大的問題,使用SPI驅動時讀數為0 -1 或者其他很大的數(都是不對的數),經過反復驗證后發現與SPI時鐘有關,參考STM32 驅動ADS1256程序 硬件SPI 時鐘分頻為256,燒錄后驅動正常,修改分頻系數后,讀數異常。但是256分頻后 時鐘頻率約1.幾KHz 速度太慢。有反復調試了一會,發現SPI時鐘速度 ,ADC采樣頻率都可能會導致讀數錯誤,具體問題沒有細究。經過調試后可以使用該程序驅動SGM58601。下面附上代碼,單片機為GD32E103。
單片機源程序如下:
- #include "SGM58601.H"
- void SGM58601_Gpio_Init(void)
- {
- gpio_init(SGM58601_GPIO_RCU,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ, SGM58601_DRDY_PIN);
- }
- void SGM58601AWREG(unsigned char regaddr,unsigned char databyte) //A
- {
-
- SPI_CS1_ENABLE();
- while(SGM58601_DRDY);//當SGM58601_DRDY為低時才能寫寄存器
- //向寄存器寫入數據地址
- SPI0_ReadWriteByte(SGM58601_CMD_WREG | (regaddr & 0x0F));
- //寫入數據的個數n-1
- SPI0_ReadWriteByte(0x00);
- //向regaddr地址指向的寄存器寫入數據databyte
- SPI0_ReadWriteByte(databyte);
- SPI_CS1_DISABLE();
- }
- void SGM58601BWREG(unsigned char regaddr,unsigned char databyte) //B
- {
-
- SPI_CS2_ENABLE();
- while(SGM58601_DRDY);//當SGM58601_DRDY為低時才能寫寄存器
- //向寄存器寫入數據地址
- SPI0_ReadWriteByte(SGM58601_CMD_WREG | (regaddr & 0x0F));
- //寫入數據的個數n-1
- SPI0_ReadWriteByte(0x00);
- //向regaddr地址指向的寄存器寫入數據databyte
- SPI0_ReadWriteByte(databyte);
- SPI_CS2_DISABLE();
- }
- //初始化SGM58601 // 單端采集
- void SGM58601A_Init(void) //A
- {
- //*************自校準****************
- // while(SGM58601_DRDY);
- // SPI_CS1_ENABLE();
- // SPI0_ReadWriteByte(SGM58601_CMD_SELFCAL);
- // while(SGM58601_DRDY);
- // SPI_CS1_DISABLE();
- //**********************************
- SGM58601AWREG(SGM58601_STATUS,0x06); // 高位在前、使用緩沖
- // SGM58601AWREG(SGM58601_STATUS,0x04); // 高位在前、不使用緩沖
- // SGM58601AWREG(SGM58601_MUX,0x08); // 初始化端口A0為‘+’,AINCOM位‘-’
- SGM58601AWREG(SGM58601_ADCON,SGM58601_GAIN_1); // 放大倍數1
- SGM58601AWREG(SGM58601_DRATE,SGM58601_DRATE_7500SPS); // 數據10sps
- SGM58601AWREG(SGM58601_IO,0x00);
- //*************自校準****************
- // while(SGM58601_DRDY);
- // SPI_CS1_ENABLE();
- // SPI0_ReadWriteByte(SGM58601_CMD_SELFCAL);
- // while(SGM58601_DRDY);
- // SPI_CS1_DISABLE();
- //**********************************
- }
- //初始化SGM58601 // 差分采集
- void SGM58601B_Init(void) //B
- {
- //*************自校準****************
- // while(SGM58601_DRDY);
- // SPI_CS2_ENABLE();
- // SPI0_ReadWriteByte(SGM58601_CMD_SELFCAL);
- // while(SGM58601_DRDY);
- // SPI_CS2_DISABLE();
- //**********************************
- SGM58601BWREG(SGM58601_STATUS,0x06); // 高位在前、使用緩沖
- // SGM58601BWREG(SGM58601_STATUS,0x04); // 高位在前、不使用緩沖
- SGM58601BWREG(SGM58601_MUX,0x08); // 初始化端口A0為‘+’,AINCOM位‘-’
- SGM58601BWREG(SGM58601_ADCON,SGM58601_GAIN_64); // 放大倍數1
- SGM58601BWREG(SGM58601_DRATE,SGM58601_DRATE_2000SPS); // 數據10sps
- SGM58601BWREG(SGM58601_IO,0x00);
- //*************自校準****************
- // while(SGM58601_DRDY);
- // SPI_CS2_ENABLE();
- // SPI0_ReadWriteByte(SGM58601_CMD_SELFCAL);
- // while(SGM58601_DRDY);
- // SPI_CS2_DISABLE();
- //**********************************
- }
- //讀取單端AD值
- signed int SGM58601AReadData(unsigned char channel) //A
- {
- unsigned int sum=0;
-
- while(SGM58601_DRDY);//當SGM58601_DRDY為低時才能寫寄存器
- SGM58601AWREG(SGM58601_MUX,channel); //設置通道
- SPI_CS1_ENABLE();
- SPI0_ReadWriteByte(SGM58601_CMD_SYNC);
- SPI0_ReadWriteByte(SGM58601_CMD_WAKEUP);
- SPI0_ReadWriteByte(SGM58601_CMD_RDATA);
- sum |= (SPI0_ReadWriteByte(0xff) << 16);
- sum |= (SPI0_ReadWriteByte(0xff) << 8);
- sum |= SPI0_ReadWriteByte(0xff);
- SPI_CS1_DISABLE();
- if (sum>0x7FFFFF) // if MSB=1,
- {
- sum -= 0x1000000; // do 2's complement
- }
- return sum;
- }
- signed int SGM58601BReadData(unsigned char channel) //B
- {
- unsigned int sum=0;
-
- while(SGM58601_DRDY);//當SGM58601_DRDY為低時才能寫寄存器
- SGM58601BWREG(SGM58601_MUX,channel); //設置通道
- SPI_CS2_ENABLE();
- SPI0_ReadWriteByte(SGM58601_CMD_SYNC);
- SPI0_ReadWriteByte(SGM58601_CMD_WAKEUP);
- SPI0_ReadWriteByte(SGM58601_CMD_RDATA);
- sum |= (SPI0_ReadWriteByte(0xff) << 16);
- sum |= (SPI0_ReadWriteByte(0xff) << 8);
- sum |= SPI0_ReadWriteByte(0xff);
- SPI_CS2_DISABLE();
- if (sum>0x7FFFFF) // if MSB=1,
- {
- sum -= 0x1000000; // do 2's complement
- }
- return sum;
- }
- int SGM58601_Read_SingleData(unsigned char channel)
- {
- return SGM58601AReadData( (channel << 4) | SGM58601_MUXN_AINCOM);
- }
- int SGM58601_Read_DiffData(void)
- {
- return SGM58601BReadData( SGM58601_MUXP_AIN0 | SGM58601_MUXN_AIN1);
- }
復制代碼 |
|