这个芯片用在汽车上,可能国内用的比较少,所以国内基本上除了能找到一本英文说明书以外,找不到其他什么资料了,更别说有什么驱动代码可以参考。在工作中,出于项目需要,不得不用到了这个芯片。我分享一下我自己调试的底层驱动和注意事项,供大家参考。
这个芯片有24路,可以用来检测每一路的通断状态(也可以说是高低电平),也可以用来测试ADC,我这里实际的项目是用来检测保险丝的通断状态。MCU检测个高低电平是再平常不过的事,但是这样一个芯片就可以检测24路,检测结果通过SPI通讯到MCU,所以极大减少了MCU的引脚需求,这点还是比较吸引人的。
如果是用于判断高低电平的话,配置以上寄存器就足够了。
u32 TIC12400Q1_Write(u8 addr, u32 data){ u8 bit; u32 SentData = 0x80000000 , ReadData = 0; //写数据,bit31必须是1 SentData |= (addr << 25); SentData |= ((data & 0xFFFFFF) << 1); //写入的有效数据从bit1开始 SCLK_L; CSA_H; delay_us(1); CSA_L; delay_us(1); SCLK_H; for(bit = 0 ; bit <32 ; bit++) { SCLK_H; if((SentData & 0x80000000) == 0x80000000) SI_H; else SI_L; //72M的时钟频率,我从示波器上测量出的高低电平持续 SCLK_L; //时间大于120ns,所以这里就不需要做任何延时了 SentData <<= 1; if(SO) ReadData |= (0x80000000 >> bit); } SCLK_L; delay_us(1); CSA_H; return (ReadData & 0x1FFFFFE) >>1; //移除掉所有的标志位和校验位,只返回寄存器的有效数据}u32 TIC12400Q1_Read(u8 addr){ u8 bit; u32 SentData = 0x00000000 , ReadData = 0; //写数据,bit31必须是0 SentData |= (addr << 25); SCLK_L; CSA_H; delay_us(1); CSA_L; delay_us(1); SCLK_H; for(bit = 0 ; bit <32 ; bit++) { SCLK_H; if((SentData & 0x80000000) == 0x80000000) SI_H; else SI_L; SCLK_L; SentData <<= 1; if(SO) ReadData |= (0x80000000 >> bit); } SCLK_L; delay_us(1);; CSA_H; return (ReadData & 0x1FFFFFE) >>1; //移除掉所有的标志位和校验位,只返回寄存器的有效数据}void TIC12400Q1_1_32bitSPI_Init(){ TIC12400Q1_Write(1,0x32,0); //全部设为比较模式 TIC12400Q1_Write(1,0x21,0x00); //比较阈值全部位2V TIC12400Q1_Write(1,0x1C,0); //全部设为对GND TIC12400Q1_Write(1,0x1B,0xFFFFFF); //所有通道全部使能 TIC12400Q1_Write(1,0x1A,0x800); //开始转换}
以上全部是我的实际项目中的实际经验,代码也是实际验证过的。代码也有很多可以优化的地方。或许存在些许错误,如果哪位大神有发现错误的地方,请及时指正。
——冷亦花烟_CYB(菜蔡)
2019.3.7 23:51
联系客服