询问用过炬力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相电压
} mark 楼主你好,请问你的程序存在的问题解决了吗? 本人用汇编51做过,不过读出的是16位补码,还要转换,道理是一样的,注意命脉令是上升沿放到数据线上下降沿发送出去,
很容易就读到,现在我要用ARM7做,SPI不知用哪种型式,因为无论是ARV,或51都是模拟的,CLK是可控的,ARM7速度快,发过命令要停一下,才能读到数据,时钟要不要停?怎么停? ARM7 的SPI应该也可控吧,我也是用ARM7,目前也正在研究…… 我在用MCU与ATT7022通信时,SPI读操作需要接收25位才正确,还有写操作也要写25位才能进行校表,哪位能说明下原因吗?? 正常回复【5楼】liang52468
-----------------------------------------------------------------------
正常现象 wxd123com 发表于 2012-1-4 11:40
正常回复【5楼】liang52468
-----------------------------------------------------------------------
...
表示用stm32的io口模拟SPI与7022通讯总是不成功,请教大神
页:
[1]