OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6127|回复: 16

IIC主从机通信问题

[复制链接]

9

主题

18

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2014-12-24
在线时间
7 小时
发表于 2017-9-5 16:16:46 | 显示全部楼层 |阅读模式
10金钱
目前手里有个项目,需要用到IIC通信;
主机用STM32模拟iic,从机用STM8硬件IIC。
现在的问题是主机可以与从机通信,也能讲数据读回来,但是有一点:
收到的第一个字节总是0XFF,然后才是我需要的数据;
但是收到的数据顺序总是不断变化;偶尔数据中还会出现一个字节是0xff。

希望有做过IIC主从机通信的朋友,给予帮助,感激不尽!!!

下面贴上代码:
主机的读数据函数

[mw_shl_code=c,true]
uint32_t read_one_byte(uint8_t s8_address)
{
        uint8_t i;
        uint32_t rec_32_buff;
        bsp_SimuI2C_start(&TouchI2cPort);
        bsp_SimuI2C_write_byte(&TouchI2cPort,s8_address);
        bsp_SimuI2C_SandAck(&TouchI2cPort);
        for(i=0;i<4;i++)
        {
                rec_32_buff<<=8;
          rec_32_buff+=bsp_SimuI2C_read_byte(&TouchI2cPort);
                bsp_SimuI2C_SandAck(&TouchI2cPort);
        }
        bsp_SimuI2C_stop(&TouchI2cPort);
        return rec_32_buff;
}
[/mw_shl_code]

接下来是STM8从机程序:
这是IIC中断函数
[mw_shl_code=c,true]
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
   //接收发送
    u8 temp = 0;
    if (I2C->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)
    {
        temp = I2C->SR3&0x07;
    }
    else if ((I2C->SR1&0x84)&&(I2C->SR3&0x04))//数据字节传送完
    {
       if(data_len>=4)data_len=0;
       I2C->DR = My_Buffer[data_len];
       data_len++;
    }
    else if ((I2C->SR1&0x40)&&(0 == (I2C->SR3&0x04)))//接收时数据寄存器
    {
        temp = I2C->DR;    //读取数据寄存器
    }
    else if (I2C->SR1&0x10)//检测到停止位
    {
        I2C->CR2 = I2C->CR2;//清除停止位
    }
    //错误处理
    if (I2C->SR2&0x01)//总线错误
    {
        I2C->SR2 &= ~0x01;//清零
    }
    else if(I2C->SR2&0x02)//仲裁失败
    {
        I2C->SR2 &= ~0x02;//清零
    }
    else if(I2C->SR2&0x04)//应答失败
    {
        I2C->SR2 &= ~0x04;//清零
    }
    else if(I2C->SR2&0x08)//上溢、下溢
    {
        I2C->SR2 &= ~0x08;//清零
    }
    return;
}
[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-9-5 16:39:36 | 显示全部楼层
库里面有官方的例子,就是两个STM32之间的IIC通信
回复

使用道具 举报

9

主题

18

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2014-12-24
在线时间
7 小时
 楼主| 发表于 2017-9-5 17:10:49 | 显示全部楼层
我现在主机是32,从机是8
回复

使用道具 举报

12

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-7-17
在线时间
40 小时
发表于 2017-9-5 20:08:51 | 显示全部楼层
huanghan 发表于 2017-9-5 16:39
库里面有官方的例子,就是两个STM32之间的IIC通信

官方的不是I2C和2402的通信吗,我最近也在做这个,主从机通信总是调不出来
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-9-5 22:24:34 | 显示全部楼层
本帖最后由 huanghan 于 2017-9-5 22:27 编辑

有的,上传你个给你们看看里面的说明文件,这个工程不全,要的话,明天整理你们

I2C_TwoBoards_AdvComIT.rar

66.86 KB, 下载次数: 165

回复

使用道具 举报

9

主题

18

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2014-12-24
在线时间
7 小时
 楼主| 发表于 2017-9-6 10:12:41 | 显示全部楼层
荆白雪 发表于 2017-9-5 20:08
官方的不是I2C和2402的通信吗,我最近也在做这个,主从机通信总是调不出来

我现在是32做主机,8做从机。8里边的硬件IIC做从机,同时8模拟一组IIC来读2402
回复

使用道具 举报

9

主题

18

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2014-12-24
在线时间
7 小时
 楼主| 发表于 2017-9-6 10:13:07 | 显示全部楼层
huanghan 发表于 2017-9-5 22:24
有的,上传你个给你们看看里面的说明文件,这个工程不全,要的话,明天整理你们

好嘞。谢谢,我先看看
回复

使用道具 举报

9

主题

18

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2014-12-24
在线时间
7 小时
 楼主| 发表于 2017-9-6 10:20:12 | 显示全部楼层
huanghan 发表于 2017-9-5 22:24
有的,上传你个给你们看看里面的说明文件,这个工程不全,要的话,明天整理你们

看过了,hal库写的,移植性太差,我现在能通信上,这是数据顺序一直变。主要是有些不明的是,STM8的文档说明里边,是不是有些bug。
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-9-6 10:56:56 | 显示全部楼层
fire_Man 发表于 2017-9-6 10:20
看过了,hal库写的,移植性太差,我现在能通信上,这是数据顺序一直变。主要是有些不明的是,STM8的文档 ...

有这样的问题,有时我也做做实验看看,收上刚好有stm8s103f3p6的芯片
回复

使用道具 举报

6

主题

108

帖子

1

精华

高级会员

Rank: 4

积分
716
金钱
716
注册时间
2017-4-25
在线时间
203 小时
发表于 2017-9-6 14:45:59 | 显示全部楼层
本帖最后由 biglu 于 2017-9-6 23:23 编辑

[mw_shl_code=c,true]u16 SendBuf[16]={0x00,0X01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; //IIC的发送测试数组
__IO uint8_t Slave_Buffer_Rx[255];  
uint16_t *p1;  //存放数据的指针(用于接收的数组,要定义为全局)
__IO uint8_t Slave_Buffer_Tx[3]={ 1, 3, 5 };
u8 SendIndex=0; //发送索引
u16 Event=0;    //I2C通讯事件号        
/****************************** I2C Interrupt routine ******************************/
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
    u8 i;                                

    p1 = SendBuf;  //指针p1用来,向主机发送数据
    Event = I2C_GetLastEvent(); //先获取IIC通讯的Event

    /******************************  Receive *******************************/
        if(I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED==Event) //地址匹配+从机作为接收方
    {   
        for(i=0;i<5;i++)
        {
            while( !I2C_CheckEvent(I2C_EVENT_SLAVE_BYTE_RECEIVED )); //当收到一字节
            *(p1++) = I2C_ReceiveData(); //将接收到的iic data放入接收指针p1
            printf("%c",*(p1-1)); // (used for test)
        }
        //3 - stop communication
        while(!I2C_CheckEvent(I2C_EVENT_SLAVE_STOP_DETECTED )); //等待主机发来stop
        printf("%c",0xf3); //show communication endind (used for test)
    }

    /******************************  Transmit *******************************/
    if(I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ==Event )
    {
        I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
    }   
    if(I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED==Event) //地址匹配+从机作为发送方
    {
        SendIndex=0;
    }
    if(I2C_EVENT_SLAVE_BYTE_TRANSMITTING==Event) //地址匹配+从机作为发送方
    {
        I2C->DR = Slave_Buffer_Tx[SendIndex];
        SendIndex++;
    }

    /****************************  Error & Stop *****************************/
    if(I2C_EVENT_SLAVE_ACK_FAILURE ==Event )
    {
        //当没收到ACK,暂时先初始化一下,避免错误
        I2C_Init(I2C_Speed, I2C1_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2,\
            I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
    }
    if(I2C_EVENT_SLAVE_STOP_DETECTED==Event) //收到结束标志
    {
        I2C->CR2 |= I2C_CR2_ACK;
    }
}

[/mw_shl_code]
前段时间测试的时候弄的 stm8的硬件中断IIC从机 先看看吧 stm32的有空再发

[mw_shl_code=c,true]void IIC_Slave_Init(void)
{
  u8 Input_Clock = 0x0;

  Input_Clock = CLK_GetClockFreq()/1000000; //获取当前系统时钟频率
  IIC_GPIO_Init(); //IIC IO初始化
  I2C_DeInit(); //IIC寄存器复位

  I2C_Cmd(ENABLE); //IIC使能 (!!! 一定要在I2C_Init前面 !!!)  
  I2C_Init(I2C_Speed, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2,\
            I2C_ACK_CURR, I2C_ADDMODE_7BIT, Input_Clock); //IIC初始化
  I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF),ENABLE); //IIC中断配置
}
void IIC_GPIO_Init(void)
{
//IIC_SDA设置为 高速开漏输出, 默认低电平
GPIO_Init(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_MODE_OUT_OD_LOW_FAST);
//IIC_SCL设置为 高速开漏输出, 默认低电平
GPIO_Init(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_MODE_OUT_OD_LOW_FAST);
}[/mw_shl_code]

[mw_shl_code=c,true]/* IIC相关宏定义 */
#define I2C_Speed              100000   //IIC通讯速度(100kHz)
#define I2C_SLAVE_ADDRESS7     0x30     //从机I2C地址[/mw_shl_code]
回复

使用道具 举报

12

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-7-17
在线时间
40 小时
发表于 2017-9-6 17:12:06 | 显示全部楼层
fire_Man 发表于 2017-9-6 10:12
我现在是32做主机,8做从机。8里边的硬件IIC做从机,同时8模拟一组IIC来读2402

我之前就是模拟IIC做主机,硬件IIC做从机,现在正在改为全用硬件IIC,不知道可以不
回复

使用道具 举报

12

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-7-17
在线时间
40 小时
发表于 2017-9-6 17:13:48 | 显示全部楼层
huanghan 发表于 2017-9-5 22:24
有的,上传你个给你们看看里面的说明文件,这个工程不全,要的话,明天整理你们

恩恩,好的,谢谢
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
发表于 2017-9-6 21:04:43 | 显示全部楼层

如果没有接触过IIC,先用CPU操作一个硬件的从机吧,
等熟悉了时序再说。

不过,这个思路很奇葩,
用CPU做IIC的从机?
那我干脆用SPI总线,就多一根线。

回复

使用道具 举报

6

主题

108

帖子

1

精华

高级会员

Rank: 4

积分
716
金钱
716
注册时间
2017-4-25
在线时间
203 小时
发表于 2017-9-6 23:12:33 | 显示全部楼层
之前发的是2个stm8的iic主从机,中断里发送和接收现在继续更....

现在贴stm32-stm32的iic主从机
[mw_shl_code=c,true]/* 主机程序中的read段对应从机程序中的1-send段; 主机程序中的write段对应从机程序中2-receive段  */

/* iic主机 型号stm32f103c8t6  采用模拟iic (PB6->SCLB7->SDA) */

u8 b[16];

int main(void)
{
                u8 i;                                                                                                         //used for circle
         
                delay_init();                                                                                //延时初始化
                JTAG_Set(JTAG_SWD_DISABLE);     //关闭JTAG接口
                JTAG_Set(SWD_ENABLE);           //打开SWD接口(用于烧写调试)
                uart_init(115200);                                                        //串口1初始化,波特率115200
                LED_Init();                     //初始化LED
                Count=0;                                                                                                 //test led亮(PB13)
                printf("%c",0xff);                                                 //test uart
                IIC_Init();                                                                                 //软件模拟iic初始化
               
                while(1)
                {
                        /***************read start*******************/
                        IIC_Start();                                                                                //产生iic起始信号
                        //1 - read slave address
                        IIC_Send_Byte( 0x30|0x01);                //读器件地址(器件地址0x30+读0x01)
                        while(IIC_Wait_Ack());               
                        printf("%c",0x50);                                                //match address
                        delay_ms(5);                                                                        //等待从机处理一个字节地址位       
                        //2 - start for receiving data
                        for(i=0;i<15;i++)
                        {
                                b = IIC_Read_Byte(1);               
                                delay_us(10); //stm32-stm32 此处不需要延时
                                //stm32-stm8 需要几us速度延时,来匹配速度
                        }
                        b[15] = IIC_Read_Byte(0);
                        for(i=0;i<16;i++)                                                 //打印输出
                        {
                                printf("%c",b);
                        }
                        printf("%c",0x51);                                                 //show communication ending
                }
                /****************read end******************/
               
                /****************write start*****************
                IIC_Start();                                                                                //产生iic起始信号
                //1 - write slave address
                IIC_Send_Byte(0x30|0x00);                        //写器件地址(器件地址0x30+写0x00)
                while(IIC_Wait_Ack());                                //wait for ack
                printf("%c",0x55);                                                //match address
                //2 - start for sending data
                IIC_Send_Byte(0x01);
                while(IIC_Wait_Ack());
                delay_ms(1);                                                                         //延时太低传输数据会出错,因为从机还没处理完数据
                IIC_Send_Byte(0x02);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x04);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x08);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x10);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x20);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x40);
                while(IIC_Wait_Ack());
                delay_ms(1);
                IIC_Send_Byte(0x80);
                while(IIC_Wait_Ack());
                delay_ms(1);
                //3 - stop communication
                IIC_Stop();
                printf("%c",0xfe);                                                 //show communication ending
                ***************write end*****************/
}[/mw_shl_code]

[mw_shl_code=c,true]/* iic从机 型号stm32f103c8t6 采用硬件iic (PB6->SCLB7->SDA) */

unsigned char a[16]={0x00,0X01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

int main(void)
{
                uint8_t *p1;                                                                                //存放数据的指针
                u8 i;                                                                                                                //used for circle
       
                delay_init();                                                                                //延时初始化
                JTAG_Set(JTAG_SWD_DISABLE);     //关闭JTAG接口
                JTAG_Set(SWD_ENABLE);           //打开SWD接口(用于烧写调试)
                uart_init(115200);                                                        //串口1初始化,波特率115200
                LED_Init();                     //初始化LED
                Count=1;                                                                                                //test led off(PB13)
                I2C_Slave_Init();                                                         //硬件iic初始化
                printf("%c",0xff);                                                         //测试下串口初始化是否正常
       
                while(1)
                {
                                p1 = a;                                                                                 //指针p1用来,接收主机数据和发送数据
               
                /**********************************1-send start********************************
                //1 - judge if address matched as slave send data to matser
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED));//地址匹配+从机作为发送方
                printf("%c",0x55); //match address
   
                for(i=0;i<15;i++)
                {       
                                I2C1->DR = *(p1++);
                                while( !I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_TRANSMITTED ));       
                }
                I2C1->DR = *(p1++);
                while( !I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_ACK_FAILURE ));       
                printf("%c",0xfe);
                *********************************1-send end*********************************/
       
       
                /*******************************2-receive start******************************/
                //1 - judge if address matched as slave receive data from master
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED));//地址匹配+从机作为接收方
                printf("%c",0x55); //show match success
                //2 - receive data from master
                for(i=0;i<8;i++)
                {
                                while( !I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_RECEIVED )); //当收到一字节
                                *(p1++) = I2C_ReceiveData(I2C1); //将接收到的iic data放入接收指针p1
                                printf("%c",*(p1-1));
                }
                //3 - stop communication
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_STOP_DETECTED ));
                printf("%c",0xfe); //show communication ending
               
                /*******************************2-receive end********************************/
       
                }
}

//用于硬件iic的初始化函数
void I2C_Slave_Init(void)
{
        I2C_InitTypeDef  I2C_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

        /*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        I2C_DeInit(I2C1);//使用I2C1
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = 0x30;//从机的I2C地址,随便写的
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = 100000;//400K
  
        I2C_Cmd(I2C1, ENABLE);  //一定要在I2C_Init前面
       
        I2C_Init(I2C1, &I2C_InitStructure); //一定要在I2C_Cmd后面
}
[/mw_shl_code]

只做了简单的测试,从机也没放中断里,要放得话的跟前面我发的stm8的中断差不多吧
主机的模拟iic用原子哥的就可以了  不发工程了
回复

使用道具 举报

6

主题

108

帖子

1

精华

高级会员

Rank: 4

积分
716
金钱
716
注册时间
2017-4-25
在线时间
203 小时
发表于 2017-9-6 23:36:47 | 显示全部楼层
本帖最后由 biglu 于 2017-9-6 23:42 编辑

无聊继续更...  下面是根据stm32-stm32改的stm8硬件IIC从机,判断标志位的。
[mw_shl_code=c,true]unsigned char a[16]={0x00,0X01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

int main(void)
{     
    uint8_t *p1; //存放数据的指针
    u8 i;         //used for circle
        
    All_Congfig();     //总初始化
    printf("%c",0xff); //uart test
   
    while(1)
    {
        p1 = a; //指针p1用来,接收主机数据和发送数据
         
        /**********************************1-send start********************************/
        //1 - judge if address matched as slave send data to matser
        while(!I2C_CheckEvent(I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED));//地址匹配+从机作为发送方
        printf("%c",0x55); //match address
        for(i=0;i<15;i++)
        {        
            I2C->DR = *(p1++);
            while( !I2C_CheckEvent(I2C_EVENT_SLAVE_BYTE_TRANSMITTED ));        
        }
        I2C->DR = *(p1++);
        while( !I2C_CheckEvent(I2C_EVENT_SLAVE_ACK_FAILURE ));        
        printf("%c",0xfe);
        /*********************************1-send end*********************************/
         
        /*******************************2-receive start******************************
        //1 - judge if address matched as slave receive data from master
        while(!I2C_CheckEvent(I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED));//地址匹配+从机作为接收方
        printf("%c",0x55); //show match success
        //2 - receive data from master
        for(i=0;i<8;i++)
        {
            while( !I2C_CheckEvent(I2C_EVENT_SLAVE_BYTE_RECEIVED )); //当收到一字节
            *(p1++) = I2C_ReceiveData(); //将接收到的iic data放入接收指针p1
            printf("%c",*(p1-1));
        }
        //3 - stop communication
        while(!I2C_CheckEvent(I2C_EVENT_SLAVE_STOP_DETECTED ));
        printf("%c",0xfe); //show communication ending
        
        *******************************2-receive end********************************/
    }
}[/mw_shl_code]

[mw_shl_code=c,true]/* 初始化相关 */
#define I2C_Speed              100000
#define I2C1_SLAVE_ADDRESS7    0x30

void I2C_Slave_Init(void)
{
   u8 Input_Clock = 0x0;
  /* Get system clock frequency */
  Input_Clock = CLK_GetClockFreq()/1000000;        
  
  IIC_GPIO_Init();
  
  I2C_Cmd(ENABLE); //一定要在I2C_Init前面
  
  //Init 一定要在I2C_Cmd后面
  I2C_Init(I2C_Speed, I2C1_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2,\
            I2C_ACK_CURR, I2C_ADDMODE_7BIT, Input_Clock);
}

void IIC_GPIO_Init(void)
{
  GPIO_Init(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_MODE_OUT_OD_LOW_FAST);
  GPIO_Init(IIC_SDA_PORT, IIC_SCL_PIN, GPIO_MODE_OUT_OD_LOW_FAST);
  //初始化高速开漏输出,低电平
}[/mw_shl_code]

不过这个靠判断标志位的效果肯定没第一次发的硬件IIC中断好,不过移植程序一步步来好理解点把
发的这几个都只是简单的通讯测试,实际项目中还要加别的判断的,比如主机有时候有问题,stm8硬件从机IIC可能就死在while里,也得根据根据项目的需求来的。另外通讯可以自定义个协议 。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-9-7 00:27:47 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-9-7 08:00:37 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 11:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表