打印
[PIC®/AVR®/dsPIC®产品]

请教关于PIC16F15224 I2C 中断接收

[复制链接]
2359|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yingnin|  楼主 | 2021-6-1 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#21ic问答#
附上I2C 从中断接收,初始化和中断函数。
现在问题无法接收到数据,是I2C设置问题或是没有进入中断?请教高手
本人用的是,PIC16F15224-CNANO 开发板

void iic_int(void)
{
    SSP1DATPPS = 0x0C;           //RB4->MSSP1:SDA1;
    SSP1CL**S = 0x0E;           //RB6->MSSP1:SCL1;   
    RB4PPS = 0x08;          //RB4->MSSP1:SDA1;   
    RB6PPS = 0x07;          //RB6->MSSP1:SCL1;

    TRISB4 = 1;
    TRISB6 = 1;

    SSPM0 = 0;
    SSPM1 = 1;
    SSPM2 = 1;
    SSPM3 = 0;              // I2C slave mode ,7bit address
    CKP = 1;                // enable clock
    SSPEN=1;                //enable I2c
    SSP1ADD = slaveAddress;     // Load slave address
    SSP1STAT=0x80;
                  
    PIE1bits.SSP1IE = 1;        //Enabe interrupt MSSP   
    INTCONbits.PEIE = 1;        // 启动外部中断
    INTCONbits.GIE = 1;         // 启动外部中断  
}

void __interrupt() I2C (void)
{
    if(SSP1IE && SSP1IF)
        {
            data = SSP1BUF;
            addr(data);
        }
    SSP1IF=0;
}

使用特权

评论回复
沙发
lcczg| | 2021-6-1 14:31 | 只看该作者
Github上PIC16F15245的例程,https://github.com/microchip-pic ... i2c-slave-ph-sensor

I2C slave的代码
/**
  Company:
    Microchip Technology Inc.

  File Name:
    i2c_slave.c

  Summary:
    This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

  Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.78.1
        Device            :  PIC16F15245
        MPLABX            :  5.40
        XC8               :  2.20
*/



/*
    (c) 2018 Microchip Technology Inc. and its subsidiaries.
   
    Subject to your compliance with these terms, you may use Microchip software and any
    derivatives exclusively with Microchip products. It is your responsibility to comply with third party
    license terms applicable to your use of third party software (including open source software) that
    may accompany Microchip software.
   
    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
    IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
    FOR A PARTICULAR PURPOSE.
   
    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
    HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
    THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
    CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
    OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
    SOFTWARE.
*/
#include "mcc.h"

uint8_t slaveAddress = 0x30;                                                    // 7-bit slave address
uint8_t index =           0;                                                    // Array pointer
uint8_t temp =            0;                                                    // Temp register
uint8_t regAdd =          1;                                                    // First data byte was actually register address byte

void I2C_Initialize(void)
{
    SSP1STATbits.SMP = 1;                                                       // Disable slew control for Standard mode
    SSP1CON1bits.SSPM = 0b0110;                                                 // 7-bit slave mode
    SSP1CON2bits.SEN = 1;                                                       // Enable clock stretching
    SSP1CON3bits.SBCDE = 1;                                                     // Enable bus collision interrupts
    SSP1ADD = slaveAddress;                                                     // Load slave address
    SSP1CON1bits.SSPEN = 1;                                                     // Enable the module
   
    PIR1bits.BCL1IF = 0;                                                        // Clear Bus Collision interrupt flag
    PIR1bits.SSP1IF = 0;                                                        // Clear the SSP interrupt flag
    PIE1bits.BCL1IE = 1;                                                        // Enable BCLIF
    PIE1bits.SSP1IE = 1;                                                        // Enable SSPIF
    INTCONbits.PEIE = 1;                                                        // Enable peripheral interrupts
    INTCONbits.GIE = 1;                                                         // Enable global interrupts
}

void __interrupt() ISR(void)
{
    if(PIR1bits.SSP1IF)                                                         // Check for SSPIF
    {
        if(SSP1STATbits.R_nW == 1)                                              // Master wants to read (slave transmit)
        {
            SSP1BUF = i2cArray[index++];                                        // Load array value
            SSP1CON1bits.CKP = 1;                                               // Release clock stretch                                                         
        }   
        if(SSP1STATbits.R_nW == 0)                                              // Master wants to write (slave receive)
        {
            if(SSP1STATbits.D_nA == 0)                                          // Last byte was an address
            {
                regAdd = 1;                                                     // Next byte will be register address
                temp = SSP1BUF;                                                 // Clear BF
                SSP1CON1bits.CKP = 1;                                           // Release clock stretch
            }
            if(SSP1STATbits.D_nA == 1)                                          // Last byte was data
            {
                if(regAdd == 1)                                                 // If last byte was the register address
                {
                    index = SSP1BUF;                                            // Load register address into index
                    regAdd = 0;                                                 // Next byte will be true data
                }
                else
                {
                    if(index < ARRAY_CNT)                                       // Within array boundaries?
                    {
                        i2cArray[index++] = SSP1BUF;                            // Yes, load data from SSP1BUF
                    }
                    else
                    {
                        temp = SSP1BUF;                                         // No, array location invalid, discard data
                    }
                }
                SSP1CON1bits.CKP = 1;                                           // Release clock stretch
            }
        }
    }
    if(PIR1bits.BCL1IF == 1)
    {
        temp = SSP1BUF;                                                         // Clear BF
        PIR1bits.BCL1IF = 0;                                                    // Clear BCLIF
        SSP1CON1bits.CKP = 1;                                                   // Release clock stretching
    }
    PIR1bits.SSP1IF = 0;                                                        // Clear SSP1IF
}

使用特权

评论回复
板凳
奔波儿熊| | 2021-6-1 14:57 | 只看该作者
你的主机是什么

使用特权

评论回复
地板
CoolSilicon| | 2021-6-1 15:31 | 只看该作者
首先 建议 拿个示波器看一下, 确定I2C上有波形, 确定硬件满足要求, 再来找软件问题.

使用特权

评论回复
5
yingnin|  楼主 | 2021-6-1 15:55 | 只看该作者
非常感谢你的回复。刚用参考这个程序作改后。仿真还是不会进中断程序。是不是中断初始化有错误。

使用特权

评论回复
6
yingnin|  楼主 | 2021-6-1 16:14 | 只看该作者
主机是AVR单片机,发送数据是正常。接收原来用PIC16F690 I2C 从接收,现在想改用PIC16F15224

使用特权

评论回复
7
lcczg| | 2021-6-2 09:35 | 只看该作者
本帖最后由 lcczg 于 2021-6-2 09:59 编辑

1你的I2C的管脚初始化正确吗?相关代码贴下。

2.核对下slave地址

3.别的中断正常吗?

使用特权

评论回复
8
yingnin|  楼主 | 2021-6-2 09:44 | 只看该作者
谢谢大家的回复,现在问题解决了。是PIC16F15244_Curiosity_Nano_Schematics  RB4和RB6 搞反了被误导。

使用特权

评论回复
9
lcczg| | 2021-6-2 10:04 | 只看该作者
yingnin 发表于 2021-6-2 09:44
谢谢大家的回复,现在问题解决了。是PIC16F15244_Curiosity_Nano_Schematics  RB4和RB6 搞反了被误导。 ...

你意思是误将PIC16F15244当成15224?

使用特权

评论回复
10
yingnin|  楼主 | 2021-6-7 10:33 | 只看该作者
lcczg 发表于 2021-6-2 10:04
你意思是误将PIC16F15244当成15224?

不是的。是PIC16F15244_Curiosity_Nano_Schematics原理图误导所致

使用特权

评论回复
11
lcczg| | 2021-6-7 11:51 | 只看该作者
yingnin 发表于 2021-6-7 10:33
不是的。是PIC16F15244_Curiosity_Nano_Schematics原理图误导所致

明白了,RB4应该是SCL1,RB6应该是SDA1,是这样吗?

使用特权

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

本版积分规则

7

主题

37

帖子

1

粉丝