在公司的项目中,我们使用了TI的DRV8860驱动芯片。
我们软件的设计思路是:将芯片的ENABLE一直拉高。在发送数据前先将LATCH脚和CLK脚拉低。接着就是利用DIN脚进行8位数据的串行传输(CLK上升把数据clock到寄存器)。再把LATCH脚拉高。
我们在实验时,全部传输1(即0xff),理想输出是output输出全部低电平。可是不管我们怎么去传输,output始终没反应。也就是高阻状态。
另外,fault脚,是不是在输出有错误时,会变低
#define _SCL_H GPIO_SetBits(GPIOC, GPIO_Pin_10) /// CLK
#define _SCL_L GPIO_ResetBits(GPIOC, GPIO_Pin_10) ///
#define _DIN_H GPIO_SetBits(GPIOC, GPIO_Pin_11) /// DIN
#define _DIN_L GPIO_ResetBits(GPIOC, GPIO_Pin_11) ///
#define _EN_H GPIO_SetBits(GPIOC, GPIO_Pin_8)/// ENABLE
#define _EN_L GPIO_ResetBits(GPIOC, GPIO_Pin_8)///
#define _LATCH_H GPIO_SetBits(GPIOC, GPIO_Pin_9) /// LATCH
#define _LATCH_L GPIO_ResetBits(GPIOC, GPIO_Pin_9) ///
void Gpio_DO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
_EN_H;
}
void Send_DATA8(unsigned char Data){
unsigned char i;
_SCL_L;
for (i = 8; i != 0; i–) {
(Data & 0x80) ? _DIN_H : _DIN_L;
Delay(1);
_SCL_H;
Data = (Data << 1);
Delay(1);
if (i > 1)
_SCL_L; // left CLK HIGH at after the last data transfered
}
}
void Write_data(unsigned char Data)
{
unsigned char data;
data = Data;
_LATCH_H;
Delay(1);
_LATCH_L;
_SCL_L;
Delay(2);
Send_DATA8(data);
Delay(1);
_LATCH_H;
// Delay(1);
}
另附原理图
Wilson Zuo:
已经看过TI的相关EVM和参考设计了吧: http://www.ti.com/product/DRV8860/toolssoftware 里面有很多相关的SPI范例和波形。 这里先问一个事情,你的SPI通信速率是多少?
DRV8860有输入抗噪滤波,所以支持到的最大通信速率在300k左右。如果是上M的通信速率,则会被当做噪声滤除。
cd cd:
回复 Wilson Zuo:
请问,通信速率最小是多少。我们现在大概400K左右
cd cd:
回复 Wilson Zuo:
控制寄存器一定要写吗?我们现在只要output输出即可
Wilson Zuo:
回复 cd cd:
控制寄存器如果之前没有改写,应该是可以直接按照100%输出的。
通信速率还是先多降下来一些(200k)测试看看问题是否在这。CLK和DATA都最好接近方波占空比
cd cd:
回复 Wilson Zuo:
我们已经测试了,将通信速率降到了100K、200K、250K都行不通。另外,我们把fault管脚接了一个发光二极管,在低电平时导通。我们发现二极管总是导通的,即fault总是低电平。除非把enable管脚拉低,禁止输出,才不会导通。您能在帮我们分析下吗,
Wilson Zuo:
回复 cd cd:
如果是这样应该问题不是出在SPI速率上。
DRV8860有输出开路检测功能,在输出关断的情况下会从外部拉入30uA的电流用于开路检测。所以不把8路负载全部接上,nFAULT会有输出。
我觉得现在第一步要确定DRV8860是否已经可以控制负载。可以接上继电器等大电流负载看看是不是可以正常开通和关断。
能否贴出一帧通信波形和输出波形?
cd cd:
回复 Wilson Zuo:
问题ok了,谢谢你的帮助。我们把输出脚接有大电容,所以使得在上电后,会有大电流,过流保护
bin xu4:
回复 Wilson Zuo:
我的开路标志位OL位一直不能清零,这是什么原因呢?(对应的通道已经关闭,OCP位测试是正常的,通道上接继电器,24V的电源),急待解决!