會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





i2c for pic16f946(SSP)?
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 224
等級: 13; EXP: 96
HP : 0 / 324
MP : 74 / 15155
離線
使用PIC16F946做i2C讀取ds3231,看了資料只能設定I2C Firmware Controlled Master mode (slave idle),請問有此模式的範例可供參考嗎?

4月08日 16:58:52
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
MSSP Module 可以設定成 I2C Master 或 I2C Slave 及 I2C Multi-Master 等模式。

範例部分可以參考教育訓練光碟裡的教材http://www.microchip.com.tw/Data_CD/

8-Bits MCU 相關課程 -->
W301 Advance PICC Application

在此教材裡的 Lab7 Temperature Meter 專案下有一 I2C 參考範例:
MCP9800 IIC Function.c

程式如下:

#include <pic.h>
#include "LCD_Defs.h"
#include "Main.h"
#include "MCP9800 IIC.h"


static volatile unsigned char Runt;

union
{     
    
unsigned int Full_Temp ;
    
unsigned char Temp[2] ;
}
MCP9800;

//*******************************************************************************************
// Read_Temperature()函數
// 讀取 MCP9800 溫度感測器的溫度值
// 介面 I2C Bus,溫度解析度 12-bit (0.0625 攝氏度)
// I2C 讀取命令 : Start + Address + point + Re-Start + Address + Read MSB + Read Lsb + Stop
//*******************************************************************************************
void Read_Temperature(void)
{
    
IdleI2C();                         // ensure module is idle
      
StartI2C();                        // Start condition
    
I2C_Done();                        // Wait Start condition completed

    
Runt=WriteI2C(MCP9800_Addr_Write);    // 寫入 0x9A 命令
    
I2C_Done();                        // Clear SSPIF flag

    
Runt=WriteI2C(MCP9800_Point_Temp);    // 寫入讀取溫度的命令          
    
I2C_Done();                        // Clear SSPIF flag

       
RestartI2C();                      // initiate Restart condition
    
I2C_Done();

    
Runt=WriteI2C(MCP9800_Addr_Read);      
    
I2C_Done();                        // Clear SSPIF flag

    
MCP9800.Temp[1]=ReadI2C();        // Enable I2C Receiver & wait BF=1 until received data
    
I2C_Done();                        // Clear SSPIF flag

    
AckI2C();                        // Genarate Non_Acknowledge to MCP9800
    
I2C_Done();       

    
MCP9800.Temp[0]=ReadI2C();        // Enable I2C Receiver & wait BF=1 until received data
    
I2C_Done();                        // Clear SSPIF flag

    
NotAckI2C();                    // Genarate Non_Acknowledge to MCP9800
    
I2C_Done();      
                     
    
StopI2C();                      // send STOP condition
    
I2C_Done();                        // wait until stop condition is over
    
    
}

//*************************************************************************
// Config the MCP9800 as 12-bit resolution with 0.0625C
// Write command: Start + Address + Point + Condig Data + Stop
//*************************************************************************
void Write_MCP9800_Config(void)
{
    
IdleI2C();                         // ensure module is idle
      
StartI2C();                        // Start condition
    
I2C_Done();                        // Wait Start condition completed

    
Runt=WriteI2C(MCP9800_Addr_Write);      
    
I2C_Done();                    

    
Runt=WriteI2C(MCP9800_Point_Conf);              
    
I2C_Done();                        

       
Runt=WriteI2C(0b01100000);        // 12-bit resolotion without Shutdown.  
    
I2C_Done();                        // Clear SSPIF flag

    
NotAckI2C();                    // Genarate Non_Acknowledge to MCP9800
    
I2C_Done();      
                     
    
StopI2C();                      // send STOP condition
    
I2C_Done();                        // wait until stop condition is over     
}

//********************************************************************
// As below are I2C function
// These functions were modified from C18 I2C Libyaries' Source Code
//********************************************************************
//**** Test and wait until I2C module is idle.
void IdleI2C( void )                 
{
  while ( (
SSPCON2 & 0x1F ) || ( R_nW ) )
     continue;
}

//Send I2C bus start condition.
void StartI2C( void )
{
  
SEN = 1;            // initiate bus start condition
}

//This routine writes a single byte to the I2C bus.
unsigned char WriteI2C( unsigned char data_out )    
{
  
SSPBUF = data_out;               // write single byte to SSPBUF
  
if (WCOL)                      // test if write collision occurred
   
return ( -1 );                  // if WCOL bit is set return negative #
  
else
  {
    while(
BF);                   // wait until write cycle is complete         
    
IdleI2C();                     // ensure module is idle
    
if ( SSPCON2bits.ACKSTAT )     // test for ACK condition received
        
return ( -2 );
    else return (
0 );          // if WCOL bit is not set return non-negative #
  
}
}

unsigned char ReadI2C( void )
{
  
RCEN = 1;           // enable master for 1 byte reception
  
while ( !BF );      // wait until byte received  
  
return ( SSPBUF );              // return with read byte
}

void AckI2C( void )
{
  
ACKDT = 0;           // set acknowledge bit state for ACK
  
ACKEN = 1;           // initiate bus acknowledge sequence
}

void NotAckI2C( void )
{
  
ACKDT = 1;          // set acknowledge bit for not ACK
  
ACKEN = 1;          // initiate bus acknowledge sequence
}

void RestartI2C( void )
{
  
RSEN = 1;           // initiate bus restart condition
}
void StopI2C( void )
{
  
PEN = 1;            // initiate bus stop condition
}

void I2C_Done(void)
{
    while (!
SSPIF);            // Completed the action when the SSPIF is Hi.
    
SSPIF=0;                   // Clear SSPIF
}

//************************************************
//* Initial I2C Master Mode with 7 bits Address  *
//* Clock Speed : 100KHz @4MHz                     *
//************************************************
void Initialize_I2C_Master(void)
{
        
SCL=1;                // Initial PortC,bit 3 & 4 as Input with Open Drain
        
SDA=1;                // RC3 = SCL  ,  RC4 = SDA
        
SCL_DIR =1;            
        
SDA_DIR =1;

        
SSPCON=0b00101000;    // Enable SSP, I2C Master Mode, Clock Rate: FOSC/(4*SSPADD+1)
        
SSPSTAT=0b10000000; // Disable slew rate for 100KHz,and clear status bit
         
SSPCON2=0b00000000;    // Set SCL,SDA into Ready status
           
SSPCON3=0b00000000;  
        
SSPADD= 79;            // (32MHz/4) / (79+1)= 100KHz  
        
SSPMSK= 0xFF;
}

4月09日 09:57:51
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 224
等級: 13; EXP: 96
HP : 0 / 324
MP : 74 / 15155
離線
版主你好,MSSP我知道如何做,但SSP卻不知道,datasheet看了Master Mode的說明,看明白了,但不知如何做?

4月09日 10:05:13
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
附件為 PIC16F1937 I2C Master & I2C Slave 的範例程式,參考看看:

附加檔案:


zip I2C MASTER C CODE VERSION 2.zip 大小: 4.11 KB; 下載次數: 28
zip I2C SLAVE C CODE VERSION 1.zip 大小: 3.73 KB; 下載次數: 21

4月09日 14:59:06
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 224
等級: 13; EXP: 96
HP : 0 / 324
MP : 74 / 15155
離線
引用:

Ryang 寫道:
附件為 PIC16F1937 I2C Master & I2C Slave 的範例程式,參考看看:


檔案有問題,無法解壓縮

4月09日 15:33:13
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
我下載用 RAR 的 ZIP 解壓縮是沒有問題的。

4月09日 15:46:22
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 224
等級: 13; EXP: 96
HP : 0 / 324
MP : 74 / 15155
離線
引用:

Ryang 寫道:
附件為 PIC16F1937 I2C Master & I2C Slave 的範例程式,參考看看:


這個範例用i2c master mode,但pic16f946並沒有這個模式,若是沒辦法的話只能用軟體的方式來做

4月09日 16:04:37
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
建議:

1. PIC16F946 算是舊的元件,可以用 PIC16F1946 取代,腳位相容。

2. PIC16F946 沒有 I2C Master 只能用軟體模擬的方式來完成。

重新用 7zip 壓縮檔案上傳:

附加檔案:


zip I2C M and S.zip 大小: 7.74 KB; 下載次數: 19

4月09日 16:19:14

Ryang 於 2020年04月10日 09:53:45
轉換PDF檔 列印


Re: i2c for pic16f946(SSP)?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
引用:

garyyang 寫道:
引用:

Ryang 寫道:
附件為 PIC16F1937 I2C Master & I2C Slave 的範例程式,參考看看:


這個範例用i2c master mode,但pic16f946並沒有這個模式,若是沒辦法的話只能用軟體的方式來做


參考一下 Hi-Tech PICC 的 Software I2C 函數

附加檔案:


zip i2c.zip 大小: 5.72 KB; 下載次數: 19

4月17日 11:49:11
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project