Att7022通过SPI接口与控制器连接,ATT7022提供测量电压、电流,有功功率、无功功率、有功电能,无功电能,频率,相角,基波谐波等信息,是为三相电能表而设计.下面是ATT7022的读写操作和一些底层驱动。具体文档请参看数据手册(在上一篇文章)。控制器NXP的LPC2000系列ARM
void Att7022_Init(void)
{
PINSEL0 &= ~((0x0f << 8) + (0x03 << 12) + (0x03 << 14) + (0x03 << 16) );
IO0DIR = ( IO0DIR & ~SCLK ) | SCLK; // 时钟
IO0DIR = ( IO0DIR & ~MISO ) ; // 输入
IO0DIR = ( IO0DIR & ~MOSI ) | MOSI; // 输出
IO0DIR = ( IO0DIR & ~nCS ) | nCS; // 片选
IO0SET = nCS;
}
uint32 SpiWrite( uint8 wCmd, uint32 data )
{
uint8 i;
uint32 iRet;
IO0SET = nCS;
IO0CLR = SCLK;
IO0CLR = nCS; // 打开SPI
wCmd = wCmd | 0x80; // 最高位置位,表示为写操作
for( i = 0; i < 8; i++ ) // 发送一个字节的数据
{
IO0SET = SCLK;SpiDelay(1);
if( wCmd & 0x80 ) // 高位在前进行发送
{
IO0SET = MOSI;
}
else
{
IO0CLR = MOSI;
}
IO0CLR = SCLK;SpiDelay(1);
wCmd = wCmd << 1;
}
SpiDelay(1);
for( i = 0; i < 24; i++ ) // 发送24位的数据
{
IO0SET = SCLK;SpiDelay(1);
if( data & 0x800000 ) // 高位在前进行发送
{
IO0SET = MOSI;
}
else
{
IO0CLR = MOSI;
}
IO0CLR = SCLK;SpiDelay(1);
data = data << 1;
}
IO0SET = nCS; // 关闭SPI口
return iRet;
}
uint32 SpiRead( uint8 rCmd )
{
uint8 i;
uint32 iRet;
IO0SET = nCS;
IO0CLR = SCLK;
IO0CLR = nCS; // 打开SPI
for( i = 0; i < 8; i++ ) // 发送一个字节的数据
{
IO0SET = SCLK;SpiDelay(1);
if( rCmd & 0x80 ) // 高位在前进行发送
{
IO0SET = MOSI;
}
else
{
IO0CLR = MOSI;
}
IO0CLR = SCLK;SpiDelay(1);
rCmd = rCmd << 1;
}
SpiDelay( 10 );
iRet = 0;
for( i = 0; i < 24; i++ ) // 接收24位的数据
{
iRet = iRet << 1;
IO0SET = SCLK;SpiDelay(1);
if( IO0PIN & MISO )
{
iRet = iRet + 0x01;
}
IO0CLR = SCLK;SpiDelay(1);
}
IO0SET = nCS; // 关闭SPI口
return iRet;
}
用户410564 2011-10-10 20:24
用户592135 2011-2-27 15:47
用户136726 2009-12-11 11:42
用户1522964 2009-6-5 21:16
用户560415 2009-6-5 16:58