您的位置:首页 > 其它

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

2015-10-08 15:09 369 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: