高级会员

- 积分
- 901
- 金钱
- 901
- 注册时间
- 2015-12-24
- 在线时间
- 197 小时
|
1金钱
如题,写的STM32F103的TM7707驱动程序,现在只读取一个通道的转换值时正常,同时读取两个通道的时候读取不正确。请搞过的童鞋赐教。 代码如下,GPIO和SPI初始化代码省略。
TM7707初始化。
void TM7707_Initialize(void)
{
// Initialize GPIO for TM7707 device.
TM7707_InitializeGPIO();
// Initialize SPI controler.
TM7707_InitializeSPI2();
// Reset device(hardware).
TM7707_Reset();
// Synchronize device clock.
TM7707_SynchronizeDeviceClock();
// Self-calibration
TM7707_SelfCalibration(CH_1, GAIN_1); // Channel 1 internal self-calibration.
TM7707_SelfCalibration(CH_2, GAIN_1); // Channel 2 internal self-calibration.
// Configure the clock registers
TM7707_TransferByte(REG_CLOCK | WRITE | CH_1); // Write communication register to set clook register.
TM7707_TransferByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); // External clock, frequency is 4.9152 MHz and the sampling frequency is 50Hz.
TM7707_TransferByte(REG_CLOCK | WRITE | CH_2); // Write communication register to set clook register.
TM7707_TransferByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); // External clock, frequency is 4.9152 MHz and the sampling frequency is 50Hz.
}
TM7707校准
void TM7707_SelfCalibration(uint8_t uiChannelIndex, uint8_t uiGain)
{
uiChannelIndex = uiChannelIndex % CH_MAX;
// ADC channel self-calibration
TM7707_TransferByte(REG_SETUP | WRITE | uiChannelIndex); //Write communication register to set setup register.
TM7707_TransferByte(MD_CAL_SELF | uiGain | UNIPOLAR | BUF_EN | FSYNC_0); //Write configuration register, start self-calibration.
TM7707_WaitForDRDY(); // Wait for operation to complete(ablut 180ms).
TM7707_TransferByte(REG_SETUP | WRITE | uiChannelIndex); //Write communication register to set setup register.
TM7707_TransferByte(MD_NORMAL | uiGain | UNIPOLAR | BUF_EN | FSYNC_0); //Write configuration register, start self-calibration.
TM7707_WaitForDRDY();
}
硬件复位
void TM7707_Reset(void)
{
TM7707_ST_RESET();
TM7707_Delay(5000);
TM7707_ST_UNRESET();
TM7707_Delay(1000);
}
时钟同步
void TM7707_SynchronizeDeviceClock(void)
{
uint8_t i;
// Keep SCLK pin high at 40 cycles.
for(i=0; i<5; i++)
{
TM7707_TransferByte(0xFF);
}
}
读取转换值
uint32_t TM7707_ReadADCValue(uint8_t uiChannelIndex)
{
uint32_t rtnADValue;
rtnADValue = 0x00000000;
// Wait for the conversion to complete
TM7707_WaitForDRDY();
// Write channel index.
TM7707_TransferByte(REG_DATA | READ | uiChannelIndex);
// Read ADC value.
TM7707_CS_ENABLE();
rtnADValue |= TM7707_TransferByte(0xFF);
rtnADValue <<= 8;
rtnADValue |= TM7707_TransferByte(0xFF);
rtnADValue <<= 8;
rtnADValue |= TM7707_TransferByte(0xFF);
TM7707_CS_DISABLE();
return rtnADValue;
}
主入口
int main(void)
{
uint32_t auiADCValue[2] = {0};
float auiVoltage[2] = {0};
HSEClocks_Initialize(RCC_PLLMul_9);
NVIC_Initialize(NVIC_PriorityGroup_2);
DebugPort_Initialize(DEBUG_SWD);
Initialize_Systick(72, TRUE);
DebugSerialPort_Initialize(9600);
TM7707_Initialize();
TM7707_SelfCalibration(CH_1, GAIN_1);
TM7707_SelfCalibration(CH_2, GAIN_1);
while(1)
{
// Read adc value.
auiADCValue[0] = TM7707_ReadADCValue(CH_1);
auiVoltage[0] = 5.0*auiADCValue[0]/16777216;
auiADCValue[1] = TM7707_ReadADCValue(CH_2);
auiVoltage[1] = 5.0*auiADCValue[1]/16777216;
// Print adc value to serial.
// Format as ADvalue:Voltage:Reference
printf("CH1:%10u, Voltage:%1.6f | CH2:%10u, Voltage:%1.6f\r\n", auiADCValue[0], auiVoltage[0], auiADCValue[1], auiVoltage[1]);
}
}
附件为MDK5完整工程,STM32F103ZET6,使用SPI2,72MHz,64分频。
STM32F1_TM7707.zip
(310.89 KB, 下载次数: 449)
|
最佳答案
查看完整内容[请看2#楼]
已找到原因,很低级的错误,DRDY位判断错了。
但是发现一个新的问题,这个驱动是用TM7705的驱动程序改造而来,而根据官方的数据手册,TM7705和7707的寄存器定义并不相同,比如,7707是没有时钟寄存器的,但是有滤波数据寄存器。
但关键问题是,我按照7707数据手册操作芯片,程序乱跑,读出来的不知道啥数,但是按照7705就好用,真是费解………………
|