导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→实际使用SPI写/读MC33984内的寄存器没有响应,请高手

* 93093: 实际使用SPI写/读MC33984内的寄存器没有响应,请高手帮我看看,附有原程序

   funv 
funv发表的帖子 

 实际使用SPI写/读MC33984内的寄存器没有响应,请高手帮我看看,附有原程序
实际使用SPI写/读MC33984内的寄存器没有响应,请高手帮我看看

#include "stc12c5410ad.h"
#include "BIN2HEX.h"
#include   <intrins.h>  
#include "MC33984.h"
#include   <stdio.h>  

// 连接脚定义
sbit MC33984_WAKE = P1^6;  // D 唤醒
sbit MC33984_CSNS = P1^7;  // 电流采样信号(外下拉)
sbit MC33984_FS_  = P1^4;  // # 故障状态报告(外上拉)
sbit MC33984_RST_ = P1^5;  // D # 复位 低电平有效
sbit MC33984_CS_  = P1^3;  // U # 片选 低电平有效
sbit MC33984_SCLK = P1^2;  // D SPI 时钟
sbit MC33984_SO   = P3^7;  // SPI 输出
sbit MC33984_SI   = P1^0;  // D SPI 输入

#define P1_PUSH_PULL  B0110_1101  /* 1:表示推挽式输出的脚(P1) */
#define P3_PUSH_PULL  B0000_0000  /* 1:表示推挽式输出的脚(P3) */

#define P1_INPUT  B1000_0000   /* 1:表示只用于输入的脚(P1) */
#define P3_INPUT  B0000_0000   /* 1:表示只用于输入的脚(P3) */

//////////////////////// 输出脉冲时钟 ///////////////////////////////////
#pragma disable
void spi_puls(){
 _nop_();
 MC33984_SCLK = 1;
 _nop_();
 _nop_();
 _nop_();
 MC33984_SCLK = 0;
 _nop_();
 _nop_();
}

//////////////////////// 输出命令 ///////////////////////////////////////
#pragma disable
void spi_write( unsigned char v ){
 unsigned char i;
 printf( "W=%BX\n", v );  //debug
 MC33984_CS_ = 0;
 for(i=0; i  <8;i++){
  if( v & 0x80 ) MC33984_SI = 1;
  else MC33984_SI = 0;
  spi_puls();
  v = v  <  <1;
 }
 MC33984_SI = 0;
 MC33984_CS_ = 1;
}

//////////////////////// 取内容 ////////////////////////////////////////
#pragma disable
unsigned char spi_read( ){
 unsigned char temp;
 unsigned char i;
 
 temp = 0;
 MC33984_CS_ = 0;
 for(i=0;i  <8;i++){
  temp = temp  <  <1;
  spi_puls();
  if( MC33984_SO ){
       temp |= 0x01;
  }
 }
 printf( "R=%BX\n", temp );  //debug
 return( temp );
}

////////////////////////// 命令字格式化 /////////////////////////////////
void MC33984_setup( unsigned char set, unsigned char value ){
 set |= (value & 0x0f);
 spi_write( set );
}

////////////////////////// 命令字格式化 /////////////////////////////////
unsigned char MC33984_stat( unsigned char stat ){
 unsigned char temp;

 temp = 0x0;
 temp |= (stat>  >  4) & 0x07;
 temp |= stat & 0x80;
 spi_write( temp );
 temp = spi_read( );
 return( temp );
}

////////////////////////// 初始化 //////////////////////////////////////
void MC33984_init(){
 //推挽输出脚
 P1M0 &= ~P1_PUSH_PULL;   // M1=0, M0=0 标准
 P1M1 |= P1_PUSH_PULL;   // M1=0, M0=1 输入
 P3M0 &= ~P3_PUSH_PULL;   // M1=1, M0=0 推挽
 P3M1 |= P3_PUSH_PULL;   // M1=1, M0=1 开漏
 //用作输入脚
 P1M0 |= P1_INPUT;    // M1=0, M0=0 标准
 P1M1 &= ~P1_INPUT;    // M1=0, M0=1 输入
 P3M0 |= P3_INPUT;    // M1=1, M0=0 推挽
 P3M1 &= ~P3_INPUT;    // M1=1, M0=1 开漏

 MC33984_SCLK = 0;
 MC33984_RST_ = 0;
 MC33984_WAKE = 0;
 MC33984_FS_ = 1;  // 故障状态报告 设置成输入
 MC33984_CS_ = 1;
 MC33984_SI = 0;
 MC33984_SO = 1;  // 对应的MCU脚设置成输入状态
 MC33984_WAKE = 1; // 不唤醒工作
 MC33984_RST_ = 1; // 退出复位

 MC33984_setup( MC33984_OC, B0000_1011); //[#CSNS1_EN IN1_SPI #CSNS0_EN IN0_SPI]输出控制
 MC33984_setup( MC33984_SOCHL0, B0000_1101); //[75/100A SOCL2 SOCL1 SOCL0]高低过流检测电平控制
 //                                                        0     0     0 25A
 //                                                        0     0     1 22.5A
 //                                                        0     1     0 20A
 //                                                        0     1     1 17.5A
 //                                                        1     0     0 15A
 //                                                        1     0     1 12.5A
 //                                                        1     1     0 10A
 //                                                        1     1     1 7.5A
 MC33984_setup( MC33984_SOCHL1, B0000_1100); // 1是远灯--15A,0是近灯--12.5A
 MC33984_setup( MC33984_CDTOL0, B0000_1010); // 禁止开路检测 过流要检测 1.2mS
 MC33984_setup( MC33984_CDTOL1, B0000_1010);
 MC33984_setup( MC33984_DIC0,   B0000_1010); // 高速 低比率电流 禁直接 或操作
 MC33984_setup( MC33984_DIC1,   B0000_1010);
 MC33984_setup( MC33984_OSD,    B0000_0001); // 延时 0mS/75mS
 MC33984_setup( MC33984_WD,     B0000_0010); // 看门狗超时2500mS
 MC33984_setup( MC33984_UOV,    B0000_0011); // 欠压 过压 有故障时不报告
}

// STAT(s000)
// OD7    OD6   OD5   OD4    OD3      OD2   OD1   OD0
//  s     OTFs  OCHFs OCLFs  OLFs     UVF   OVF   FAULTs
// 选通道 超温 过流高 过流低 负载开路 欠压  过压
 
bit get_fault(){  // 返回非 0 表示有故障指示
//*
 if( MC33984_FS_ ){
  putchar( ''''1'''' );
 }else{
  putchar( ''''0'''' );
 }
//*/
 return( !MC33984_FS_ );
}

/*
void test(){
 unsigned char i;
 for(i=1;i  <16;i++){
  MC33984_SCLK = 1;
  MC33984_SCLK = 0;
  MC33984_RST_ = 1;
  MC33984_RST_ = 0;
  MC33984_WAKE = 1;
  MC33984_WAKE = 0;
  MC33984_FS_ = 1;  // 故障状态报告 设置成输入
  MC33984_FS_ = 0;
  MC33984_CS_ = 1;
  MC33984_CS_ = 0;
  MC33984_SI = 1;
  MC33984_SI = 0;
 }
}
*/




发表时间:2006年5月20日8:56:02

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:有谁用过"电容式测厚传感器"(测介质也可以)有谁用过"电容式测厚传感器
[下一篇帖子]:没有包含.c文件没有包含.c文件