搜索
bottom↓
回复: 1

调试SPI通信,读从设备寄存器里面数据老是不对,求教

[复制链接]

出0入0汤圆

发表于 2012-12-20 21:06:14 | 显示全部楼层 |阅读模式
#include <iom8v.h>
#include <macros.h>
#define   uint8 unsigned char
#define   uint16 unsigned int
/*-----------------RN8209--------------------------*/
uint8   Write_enable[1]={0xE5};// 写使能
uint8   IARMS[3]={0};//通道A电流有效值
#define  RN8209_MOSI  3
#define  RN8209_MISO  4
#define  RN8209_SCK   5
#define   CLR8209  PORTB&=~(1<<PB0); //CS为低电平,使能SPI
#define   SET8209   PORTB|= (1<<PB0);
#define   RN8209_IARMS   0x7f//通道A电流有效值

//数码管定义15E显示板 0-9 空
uint8   SegTab[19]={0x77,0x12,0xD5,0xD6,0xB2,0xE6,0xE7,0x52,0xF7,0xF6,0x00,0x80,0xF1,0x65,0x61,0xF3,0x97,0xA7,0x81};     
uint8   Up_Disbuff[4]={1};
uint8   Middle_Disbuff[4]={1};
uint8   Down_Disbuff[4]={1};
/* -----------------数码显示扫描缓冲区------------------*/

uint8  Axx[4]={0x00,0x04,0x02,0x06};//译码地址
/*--------------------延时---------------------*/
void delay_us(uint16 us)
{
        uint16 i;
        us=us*5/4;
        for(i=0;i<us;i++);
}
void delay_ms(uint16 ms)
{
        uint16 i,j;
        for(i=0;i<ms;i++)
                for(j=0;j<1141;j++);
}
/*--------------------74HC164输入数据----------------*/
void write_164(uint8 ChrDat)
{
    uint8 i;
        for(i=8;i>0;i--)
        {
                if(ChrDat&0x80)// 输出数据
                        PORTD|=(1<<PD5);//PD5为74HC164的数据输入端,置1
                else
                        PORTD&=~(1<<PD5);//置0
                   ChrDat<<=1;
                PORTD&=~(1<<PD7);   //PD7为74HC164的时钟信号,置0
                PORTD|=(1<<PD7);    //时钟给上升延信号,置1
    }
}
/*-------------------74F138输入口数据--------------------*/
void  out138(uint8 x)   
{
        uint8 i;
        i  = PORTC & 0xF8 ;
    x  = x & 0x07 ;
        PORTC = i | x ;
}
/*--------------------刷新显示一次的程序--------------------*/
void  display(void)
{
    uint8 temp_address = 0 ;
        for(temp_address=0;temp_address<4;temp_address++)
        {
                PORTC=0x07;//消影
                write_164(SegTab[Down_Disbuff[temp_address]]);
                write_164(SegTab[Middle_Disbuff[temp_address]]);
        write_164(SegTab[Up_Disbuff[temp_address]]);
                out138(Axx[temp_address]);  //显示
                delay_ms(1);//延时1ms
        }

}
/*-----------RN8209读写函数-----------------------*/
void Reset_RN8209(void)
{
        SET8209;
        delay_us(10);
        PORTB&=~(1<<RN8209_SCK);//时钟拉低
        CLR8209;//拉低
        delay_us(10);
}
void  Write_RN8209_Byte(uint8  wdata)
{
        uint8  i ;
    for(i=0;i<8;i++)
        {
                PORTB&=~(1<<RN8209_SCK);//时钟拉低
                if(wdata&0x80)//先发高位,上升沿
                {
                        PORTB|=(1<<RN8209_MOSI);
                }
                else
                {
                        PORTB&=~(1<<RN8209_MOSI);
                }
                delay_us(10);
                PORTB|=(1<<RN8209_SCK);//时钟拉高
                wdata<<=1;
        }
}
uint8 Read_RN8209_Byte(void)
{
        uint8 i,rdata;
        for(i=0;i<8;i++)
        {
               
                rdata<<1;
            PORTB|=(1<<RN8209_SCK); //读数据时为下降沿读出     
                delay_us(10);               
                PORTB&=~(1<<RN8209_SCK);//时钟拉低
                delay_us(10);
                if(PINB&(1<<RN8209_MISO))
                {
                        rdata|=0x01;
                }
        }
        return  rdata;
}
void Write_RN8209_Reg(uint8 regn, uint8 *data, uint8 num)
{
        Reset_RN8209();
        Write_RN8209_Byte(regn|0x80);//命令寄存器最高位为1表示写,写命令寄存器+芯片解析+响应命令
        while(num--)
        {
                Write_RN8209_Byte(data[num]);//单字节高位在前地位在后。多字节高字节在前,低字节在后
        }
        PORTB&=~(1<<RN8209_SCK);//拉低时钟端
        delay_us(10);
        SET8209;//拉高片选端
}


void Read_RN8209_Reg(uint8 regn,uint8 *data,uint8 num)
{
        Reset_RN8209();
        Write_RN8209_Byte(regn&0x7f);//命令寄存器最高位为0表示读  
        while(num--)
        {
                data[num] = Read_RN8209_Byte();//以字节为传输  高比特在前,低比特在后;多字节传输先传高字节再传低字节
        }
        PORTB&=~(1<<RN8209_SCK);//拉低时钟端
        delay_us(10);
        SET8209;//拉高片选端
       
}
/*long Hex_To_Dex(uint8 *data,uint8 num)
{
        uint8 i;
        long k=0;
        for(i=0;i<(num-1);i++)
         {
                   k|=data[i];
             k<<=8;
         }
  
   return k;

}*/
void Init_RN8209(void)
{       
    Write_RN8209_Reg(0xEA,Write_enable,1);//写使能
}
void main(void)
{       
        //long temp;
        PORTB=0x00;
        DDRB=0x2D;//设置MISO(PB4)为输入,高电平;MOSI(PB3) ,SCK(PB5) 和SS(PB2)为输出,高电平
                          //0010 1101
        PORTC=0x07;
        DDRC=0x07;//74HC138控制端CBA输为输出
        PORTD=0xE0;//74HC164的CLR为PD6刚开始为高
    DDRD=0xE0;
       
        Init_RN8209();
       
        while(1)
        {
                
                if(PIND&(1<<PD2))
                {
                        Read_RN8209_Reg(RN8209_IARMS,IARMS,3);
                        //temp=Hex_To_Dex(IARMS,3);
                        Up_Disbuff[3]=IARMS[2]>>4;
                        Up_Disbuff[3]=IARMS[2]&0x0f;
                        Up_Disbuff[2]=IARMS[1]>>4;
                        Up_Disbuff[2]=IARMS[1]&0x0f;
                        Middle_Disbuff[1]=IARMS[0]>>4;
                        Middle_Disbuff[1]=IARMS[0]&0x0f;
                }
                display();
        }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-12-20 21:11:42 | 显示全部楼层
本帖最后由 bbxyliyang08 于 2012-12-20 21:23 编辑

附上从设备资料,我是读寄存器7f里面的值,因为这里面的值是固定的是820900H,由于我这板子没JTAG接口,只能通过数码管显示出来,同时也附上我们项目的原理图,搞不出来就得走人,社会就这么现实,各位大侠们,帮帮忙,小弟不胜感激。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表