xzyang 发表于 2006-10-6 14:21:20

询问用过炬力ATT7022的朋友请帮忙看一下我的模拟SPI读写程序

CPU:ATMEGA128 > ATT7022B



现在的问题无法与7022通讯,以下是程序:编译环境:Code VisionAVR



#include <mega128.h>

#include <stdio.h>

#include<delay.h>

#define uchar unsigned char

#define uintunsigned int

#define ulong unsigned long

/*******************************/*****************************************************

ATT7022口线定义:

SIG--------- PORTB.0 双项输入

Din--------- PORTB.2 单项输出

Dout-------- PORTB.3 双项输入

SCLK-------- PORTB.4 单项输出

CS---------- PORTB.5 单项输出

SEL--------- PORTB.6 单项输出

RESET------- PORTB.1 单项输出

#define SET1302_RST PORTB|=(1<<7)

#define CLR1302_RST PORTB&=~(1<<7)

*************************************************************************************/

#define ATT_SIG   PINB.0

#define ATT_Din   PORTB.2

#define ATT_DoutPINB.3

#define ATT_SCLKPORTB.4

#define ATT_CS    PORTB.5

#define ATT_SEL   PORTB.6

#define ATT_RESTPORTB.1

#define SET7022_Din   PORTB|=(1<<2)

#define CLR7022_Din   PORTB&=~(1<<2)

#define SET7022_SCLKPORTB|=(1<<4)

#define CLR7022_SCLKPORTB&=~(1<<4)

#define SET7022_CS    PORTB|=(1<<5)

#define CLR7022_CS    PORTB&=~(1<<5)

/*************************************************************************************/

ulong Read_SPI(uchar comm)

{

uchar j; ulong rbyte=0;

if(ATT_SIG==0)

    {

      SET7022_CS;         //使能SPI

      CLR7022_SCLK;

      CLR7022_CS;

      #asm("cli")         //关中断

      for(j=0;j<8;j++)

      {

         SET7022_SCLK;//送时钟

         if((comm<<j)&0x80){SET7022_Din;}

         else            {CLR7022_Din;}

         nop;

         nop;

         nop;

         CLR7022_SCLK;//送时钟

      }

      CLR7022_Din;

      delay_us(50);       //等待

      for(j=0;j<24;j++)   //读数据

      {

         rbyte=rbyte<<1;

          SET7022_SCLK;

          rbyte=rbyte|((uchar)(ATT_Dout));

          nop;

         nop;

         nop;

         CLR7022_SCLK;

      }

      SET7022_CS;         //释放SPI

      #asm("sei")         //开中断

      return rbyte;

    }

}

/*************************************************************************************/

Write_SPI(uchar comm,ulong DAT)

{

uchar j;

if(ATT_SIG==0)

    {

      #asm("cli")

      ATT_CS=1;

      ATT_SCLK=0;

      ATT_CS=0;

      comm = comm|0x80;

      for(j=0;j<8;j++)

      {

         ATT_SCLK=1;//送时钟

         if((comm>>j) & 0x01){ATT_Din=1;}

         else                {ATT_Din=0;}

         ATT_SCLK=0;//送时钟

      }

      delay_us(30) ;

      for(j=0;j<24;j++)

      {

         ATT_SCLK=1;//送时钟

         if((DAT>>j) & 0x01) {ATT_Din=1;}

         else                {ATT_Din=0;}

         ATT_SCLK=0;//送时钟

      }

      ATT_CS=1;

      #asm("sei")

}

}

/**************************************************************************************/

void RESET_7022(void)

{

ATT_REST=0;

delay_ms(200);

ATT_REST=1;

ATT_SEL=1; //三相四线模式

}

/**************************************************************************************/

void main(void)

{

   ulong a;

   a=Read_SPI(0x0d);//读A相电压

}

sunny99 发表于 2009-4-22 08:37:35

mark

hebutwh 发表于 2009-5-5 16:02:02

楼主你好,请问你的程序存在的问题解决了吗?

zjfgx 发表于 2009-5-8 14:55:48

本人用汇编51做过,不过读出的是16位补码,还要转换,道理是一样的,注意命脉令是上升沿放到数据线上下降沿发送出去,
很容易就读到,现在我要用ARM7做,SPI不知用哪种型式,因为无论是ARV,或51都是模拟的,CLK是可控的,ARM7速度快,发过命令要停一下,才能读到数据,时钟要不要停?怎么停?

sunny99 发表于 2009-5-8 19:10:34

ARM7 的SPI应该也可控吧,我也是用ARM7,目前也正在研究……

liang52468 发表于 2010-6-17 09:19:27

我在用MCU与ATT7022通信时,SPI读操作需要接收25位才正确,还有写操作也要写25位才能进行校表,哪位能说明下原因吗??

wxd123com 发表于 2012-1-4 11:40:49

正常回复【5楼】liang52468
-----------------------------------------------------------------------
正常现象

caorui117017 发表于 2014-6-11 15:31:08

wxd123com 发表于 2012-1-4 11:40
正常回复【5楼】liang52468
-----------------------------------------------------------------------
...

表示用stm32的io口模拟SPI与7022通讯总是不成功,请教大神
页: [1]
查看完整版本: 询问用过炬力ATT7022的朋友请帮忙看一下我的模拟SPI读写程序