stm8 读取电表芯片 att7053 io口模拟 spi



unsigned long SPI_Read( unsigned char address )
{
signed char i;
unsigned long temp_data;
temp_data = 0;
ATT7053_SCK_LOW;                        /* 确保CLK初始状态是 */
Delay1us( 1 );
ATT7053_CS_HIGH;
Delay1us( 2 );
ATT7053_CS_LOW;
Delay1us( 5 );
ATT7053_SCK_HIGH;                       /* 启动数据传输 */
Delay1us( 1 );
ATT7053_MOSI_LOW;                       /* 0表示主机向从机读数据 */
Delay1us( 1 );
ATT7053_SCK_LOW;                        /* 从机需要在下降沿取数据 */
Delay1us( 1 );


for ( i = 6; i >= 0; i-- )
{
ATT7053_SCK_HIGH;               /* 启动数据传输 */
Delay1us( 1 );
if ( (address & (0x01 << i) ) >> i )
ATT7053_MOSI_HIGH;      /* address 地址从0x00到0x7F */
else
ATT7053_MOSI_LOW;
Delay1us( 1 );
ATT7053_SCK_LOW;                /* 从机需要在下降沿取数据 */
Delay1us( 1 );
}
/* 从机接收到命令后,开始送出数据,上升沿送数据 */
Delay1us( 1 );
ATT7053_SCK_HIGH;
Delay1us( 1 );
ATT7053_SCK_LOW;
if ( ATT7053_MISO_VALUE )
temp_data = temp_data | 1;
Delay1us( 1 );
for ( i = 0; i < 23; i++ )
{
ATT7053_SCK_HIGH;
Delay1us( 1 );
ATT7053_SCK_LOW;
if ( ATT7053_MISO_VALUE )
miso_val = 1;
else
miso_val = 0;
temp_data = (temp_data << 1) | miso_val;
Delay1us( 1 );
}
ATT7053_CS_HIGH;
return(temp_data);
}




void SPI_Write( unsigned char address, unsigned int write_data )
{
signed char i;
unsigned int temp_data;




temp_data = 1;
ATT7053_SCK_LOW;                                /* 确保CLK初始状态是0 */
Delay1us( 100 );
ATT7053_CS_HIGH;
Delay1us( 50 );
ATT7053_CS_LOW;
Delay1us( 100 );


ATT7053_SCK_HIGH;                               /* 启动数据传输 */
Delay1us( 10 );
ATT7053_MOSI_HIGH;                              /* 1表示主机向从机写数据 */
Delay1us( 10 );
ATT7053_SCK_LOW;                                /* 从机需要在下降沿取数据 */
Delay1us( 10 );


for ( i = 6; i >= 0; i-- )
{
ATT7053_SCK_HIGH;                       /* 启动数据传输 */
Delay1us( 10 );
if ( (address & (0x01 << i) ) >> i )    /* address 地址从0x00到0x7F */
{
ATT7053_MOSI_HIGH;
}else ATT7053_MOSI_LOW;
Delay1us( 10 );
ATT7053_SCK_LOW;                        /* 从机需要在下降沿取数据 */
Delay1us( 10 );
}
/* 从机接收到命令后,开始送出数据,上升沿送数据 */
Delay1us( 40 );


for ( i = 23; i >= 0; i-- )
{
ATT7053_SCK_HIGH;                               /* 启动数据传输 */
Delay1us( 10 );
if ( (write_data & (temp_data << i) ) >> i )    /* address 地址从0x00到0x7F */
{
ATT7053_MOSI_HIGH;
}else ATT7053_MOSI_LOW;
Delay1us( 10 );
ATT7053_SCK_LOW;                                /* 从机需要在下降沿取数据 */
Delay1us( 10 );
}
ATT7053_CS_HIGH;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值