打印
[技术问答]

N76E003做为I2C从机,主机接收到从机地址?

[复制链接]
4604|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pener|  楼主 | 2018-3-2 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用stm8s003的硬件I2C做主机,N76E003的硬件I2C做从机,并在中断里接收主机发过来的数据以及应答。
主机通信流程是start->addr+w->reg->start->addr+r->(data1)->ack->(data2)->nack->stop
主机应该接收data1和data2两个字节数据就可以了,但是实际也接收到addr+r这个字节。
请问这一般会是什么原因导致的?
沙发
734774645| | 2018-3-2 23:10 | 只看该作者
能用就好。

使用特权

评论回复
板凳
xixi2017| | 2018-3-5 12:22 | 只看该作者
不知道这是什么问题,看不懂啊

使用特权

评论回复
地板
yingtexin| | 2018-3-7 09:10 | 只看该作者
很遗憾没能帮你解决问题,怎么使用两个品牌的MCU呢?这样工作量不是很大吗?

使用特权

评论回复
5
dongnanxibei| | 2018-3-8 15:31 | 只看该作者
一个开发板上使用两家的单片机一起工作?

使用特权

评论回复
6
flove00| | 2018-3-24 10:37 | 只看该作者
老师能否贴下 I2C从机的接收代码,官方的实在看不懂。。。

使用特权

评论回复
7
yiyigirl2014| | 2018-3-24 17:34 | 只看该作者
其实大家都觉得官方的I2C看着费劲。

使用特权

评论回复
8
wahahaheihei| | 2018-3-24 17:47 | 只看该作者
官方的那个例子跑起来,你不是很满意是吧

使用特权

评论回复
9
xuanhuanzi| | 2018-3-25 09:45 | 只看该作者
start->addr+w->reg->start->addr+r->(data1)->ack->(data2)->nack->stop
这一串看不懂啊,是指针啊,还是箭头啊。

使用特权

评论回复
10
forred| | 2018-6-2 10:48 | 只看该作者
摘定了没有?也遇到类似问题了。

使用特权

评论回复
11
dongnanxibei| | 2018-6-2 13:35 | 只看该作者
这是ST的吧,不是心疼的。

使用特权

评论回复
12
tianxj01| | 2018-6-2 16:02 | 只看该作者
STM8的硬件IIC真心不好用,尤其ACk处理部分,奇奇怪怪问题多,换软IIC就完全没问题了。
新唐003还没用过IIC。不敢乱加评论。

使用特权

评论回复
13
dongnanxibei| | 2018-6-2 16:34 | 只看该作者
是的ST8的内核都很烂。

使用特权

评论回复
14
呵呵呵囧行| | 2018-7-16 16:29 | 只看该作者
大哥  请教一下  我是新人   在玩n76e003的 IIC   我用STM32的硬件IIC能够和官方例程上的从机通信、
但是用模拟的却不行   发送  start->addr+w  他给我ACK后我在给他数据就不鸟我了 (那边不进中断了)代码如下
       
         I2C_Start();//1
        I2C_SendByte(DEV_ADDR |I2C_WR);        /*2 */
        if (I2C_WaitAck() != 0)//3
        {
                printf("03_w");
                goto cmd_fail;       
        }

        发送字节地址
        //4
        I2C_SendByte(0xf0);//因为没有设置地址 可以随意写   (硬件上我就这么写的)
       
        //5
        if (I2C_WaitAck() != 0)
        {
                     /////////////////  测试死在这了   
                goto cmd_fail;       
        }

使用特权

评论回复
15
jasontu| | 2018-7-17 08:52 | 只看该作者
楼上的代码没有清除i2c si 中断flag

使用特权

评论回复
16
呵呵呵囧行| | 2018-7-18 09:58 | 只看该作者
jasontu 发表于 2018-7-17 08:52
楼上的代码没有清除i2c si 中断flag

怎么清除 I2C_WaitAck()  里面不就有了吗
uint8_t I2C_WaitAck(void)
{
        uint8_t re;

        I2C_SDA_HIGH();        /* CPU释放SDA总线 */
        I2C_Delay();
        I2C_SCL_HIGH();        /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
        I2C_Delay();
        if (I2C_SDA_READ())        /* CPU读取SDA口线状态 */
        {
                re = 1;
        }
        else
        {
                re = 0;
        }
        I2C_SCL_LOW();
        I2C_Delay();
        return re;
}

这些底层驱动是从EEPROM拿来的  不是直接用就好吗?

使用特权

评论回复
17
lxtiger| | 2018-7-18 10:03 | 只看该作者
start->addr+w->reg->start->addr+r->(data1)->ack->(data2)->nack->stop
主机与从机的协议一致就可正常的读写,需双方一致,你也可以自己定义为
start->addr+r->(data1)->ack->(data2)->nack->stop进行读操作,双方协议一致就能解析数据。

使用特权

评论回复
18
呵呵呵囧行| | 2018-7-18 10:04 | 只看该作者
楼主大哥  别沉啊   给下你是怎么处理的啊    或者能分享下这局部的IIC代码吗?  
当然能跟我讲解下更好   我通信的流程是和你一样的   但不知道是不是IIC底层驱动问题
但他们明明通信上一次   给他地址回应我了  但给数据就不鸟我    昨天测试把延时时间放大EEPROM的200倍
他能收到了  但还是不稳      而且不和常理 EEPROM的延时是200的  已经是标准IIC的低速了
这两百倍  ...... 但能确定硬件没问题   我用32的硬件IIC能通   但想玩下模拟的

使用特权

评论回复
19
呵呵呵囧行| | 2018-7-18 10:13 | 只看该作者
jasontu 发表于 2018-7-17 08:52
楼上的代码没有清除i2c si 中断flag

清除i2c si 中断fla  软件的不用吧  甚至不响应ACK都能通信   当然这样没质保

使用特权

评论回复
20
pener|  楼主 | 2018-7-24 08:30 | 只看该作者
呵呵呵囧行 发表于 2018-7-18 10:13
清除i2c si 中断fla  软件的不用吧  甚至不响应ACK都能通信   当然这样没质保

我是用76N003的硬件I2C从机的,在中断里处理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

140

帖子

2

粉丝