stm32与51单片机IIC通信(学习)

stm32与51单⽚机IIC通信(学习)stm32主机与51单⽚机从机IIC通信
太阳能电池控制器注意时序两单⽚机运速度不⼀样运⽤阻塞的⽅法特别是应答的时候我了好久的bug
两单⽚机可以直接导线连接
应答是否成功⽤32上两个led判断
stm32主机
#include"stm32f10x.h"
#include"iic.h"
#include"led.h"
#include"delay.h"
#include"usart.h"
int main (void)
{
IIC_Init();
IIC_Start();
LED_GPIO_Config();
USART_Config ();
printf("start");
// IIC_Send_Byte(0xFE);  //write addr
// if(IIC_Wait_Ack()){
//  IIC_Stop();
//  GPIO_ResetBits(GPIOB,GPIO_Pin_5);//ºì
// }else{
/
/  GPIO_ResetBits(GPIOE,GPIO_Pin_5);//ÂÌ
//  IIC_Send_Byte(0x0f);
//  IIC_Stop();
// }//stm32发送数据
IIC_Send_Byte(0xFF);//read addr
if(IIC_Wait_Ack()){
IIC_Stop();
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}else{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
printf("%#x\r\n",IIC_Read_Byte());
IIC_Stop();
}//接受数据并串⼝打印
return0;
}
IIC
#include"stm32f10x.h"
#include"delay.h"
#define  SCL_UP          GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define  SCL_DOWN    GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define  SDA_UP        GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define  SDA_DOWN    GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define  SDA_READ    GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_Wait_Ack(void);
void IIC_Nack(void);
void IIC_Ack(void);
void IIC_Send_Byte(u8 Byte);
u8 IIC_Read_Byte(void);
#endif
#include"iic.h"
#include"delay.h"
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_Struct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//SCL  SDA GPIO_Init(GPIOB,&GPIO_Struct);
SysTick_Init(72);
}
static void SDA_Out(void)
paas系统
{
GPIO_InitTypeDef GPIO_Struct;
GPIO_Struct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin = GPIO_Pin_7;//SDA
光碟制作GPIO_Init(GPIOB,&GPIO_Struct);
}
static void SDA_In(void)
{
GPIO_InitTypeDef GPIO_Struct;
GPIO_Struct.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
三自由度
GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin = GPIO_Pin_7;//SDA
GPIO_Init(GPIOB,&GPIO_Struct);
}
void IIC_Start(void)
{
SDA_Out();
SCL_UP;
SDA_UP;
delay_ms(4);
SDA_DOWN;
delay_ms(4);
SCL_DOWN;
delay_ms(2);
}
void IIC_Stop(void)
{
SDA_Out();
SCL_DOWN;
SDA_DOWN;
delay_ms(4);
SCL_UP;
delay_ms(4);
SDA_UP;
delay_ms(2);
}
u8 IIC_Wait_Ack(void)
{
u8 i=0;
SDA_In();
SCL_DOWN;
// SDA_UP;
delay_ms(2);
SCL_UP;
delay_ms(2);
if(SDA_READ){
i =1;
}else{
i =0;
}
SCL_DOWN;
delay_ms(2);
return i;
}
void IIC_Ack(void)
{
SDA_Out();
SCL_DOWN;
SDA_DOWN;
delay_ms(2);
SCL_UP;
delay_ms(2);
SCL_DOWN;
管式直线电机delay_ms(2);
SDA_UP;
delay_ms(2);
}
void IIC_Nack(void)
{
SDA_Out();
SCL_DOWN;
SDA_DOWN;
delay_ms(2);
SDA_UP;
delay_ms(2);
SCL_UP;
delay_ms(2);
SCL_DOWN;
delay_ms(2);
}
void IIC_Send_Byte(u8 Byte)
{
u8 i =0;
SDA_Out();
for(i=0;i<8;i++){
if(Byte&0x80){
SDA_UP;
}else{
SDA_DOWN;
}
delay_ms(2);
SCL_UP;
delay_ms(2);
SCL_DOWN;
Byte <<=1;
delay_ms(2);
}
SDA_UP;
}
u8 IIC_Read_Byte(void)
{
u8 i =0;
u8 Byte =0;
SDA_In();
for(i=0;i<8;i++){
Byte <<=1;
SCL_UP;
delay_ms(2);
if(SDA_READ){
Byte |=0x01;
}else{
Byte |=0x00;
}
SCL_DOWN;
delay_ms(2);
}
return Byte;
}
51单⽚机(从机)
#include<reg52.h>
#include<iic.h>
int main(void)
{
P1 =0xFF;
while(1){
switch(IIC_Addr_RW()){
case0: P1 =IIC_Read();break; case1:IIC_Send_Byte(0x88);break; case2: P1 =0x00;break;
}
}
return0;
}
IIc
#include<iic.h>
sbit SCL = P2^1;
sbit SDA = P2^0;
unsigned int IIC_Addr_RW(void)
{
unsigned int Addr_Check=0x00,i=0;
while(!SCL);
while(SDA);//wait iic start
for(i=0;i<8;i++){
while(SCL);
while(!SCL);
Addr_Check <<=1;
if(SDA ==1){
Addr_Check |=0x01;
}else{
Addr_Check |=0x00;
}
}
if(Addr_Check == Addr_W){
SDA =0;//ack
return0;
}else if(Addr_Check == Addr_R){
SDA =0;//ack
return1;
}else{
SDA =0;
return2;// addr error
}
}
unsigned int IIC_Read(void)
{
unsigned int Byte=0x00,i=0;
while(SCL);
while(!SCL);
while(SCL);//±£Ö¤51ºÍ32ʱÐòÏàͬ(¹ýÂËÖ÷»úµÄwaitack) SDA =1;//ÊÍ·Å×ÜÏß
for(i=0;i<8;i++){
while(SCL);
while(!SCL);
Byte <<=1;
便携式示波器if(SDA ==1){
Byte |=0x01;
}else{
Byte |=0x00;
}
}
SDA =0;
return Byte;
}
void IIC_Send_Byte(unsigned int Byte)
{
unsigned int i =0;
while(SCL);
while(!SCL);
while(SCL);//±£Ö¤51ºÍ32ʱÐòÏàͬ
for(i=0;i<8;i++){
while(!SCL);
if(Byte&0x80){
SDA =1;
}else{
SDA =0;
}
Byte <<=1;
while(SCL);

本文发布于:2024-09-21 18:32:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/100053.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:I2C通信原理
下一篇:STM32F103模拟IIC
标签:数据   应答   控制器   样运   速度   机运
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议