2019年4月17日 星期三

Rx62t 實作:I²C 對EEPROM 傳輸

目錄:

1.PDG2設定

2.接線

3.程式設計





1.PDG2設定


使用 標準模式

















設定TX,RX 中斷的方式












2.接線




EEPROM的 SDA---->PB2
EEPROM的 SCL----->PB1
記得+上拉電阻



2.程式設計

概述:分別將兩頁資料寫入EEPROM,再從EEPROM讀出
,利用讀出的資料存入RX矩陣,再利用,矩陣內容使七段顯示器輪流閃爍。


//0~9
int ssc[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

int chan[4]={0xef,0xf7,0xfb,0xfd};

//旗子
int start=1;

//變數
int i=0,j=0,k,x,y,a=2,b=2;

//測試用輸入
//i2c 1     c1   2    c2
unsigned char input[6]={0x0,0x40,0x99,0x88,0x77,0x66};

unsigned char rx[128]={0};

//中斷旗標 為了防止TX,RX有資料還沒送完
int f_IICTX=1,f_IICRX=1;

//地址
unsigned char address[2]={0,0};

// f e a g d b c dot
int led[8]={0x20,0x10,0x01,0x40,0x08,0x02,0x04,0x80};

unsigned char page1[66]={0,0};            //第一頁
unsigned char page2[66]={0,0}; //第二頁



void main(void)
{
R_PG_Clock_Set();
//iic
R_PG_I2C_Set_C0();
//七段 + 小數點
R_PG_IO_PORT_Set_P7();
R_PG_IO_PORT_Set_P9();
R_PG_IO_PORT_Set_PB(); //小數點在 B0;
//Timer
R_PG_Timer_Start_CMT_U0_C0();




//製造第二頁的矩陣  先存led 值 再存 chanal位置
for(y=3;y>-1;y--)
for(x=7;x>-1;x--)
{
//  2 4 6 8
page2[a]=led[x];
//  3 5 7 9
page2[a+1]=chan[y];
a=a+2;
}


//製造第一頁的矩陣
for(y=0;y<4;y++)
for(x=0;x<8;x++)
{
//  2 4 6 8
page1[b]=led[x];
//  3 5 7 9
page1[b+1]=chan[y];
b=b+2;
}



//第一頁的開始位置 在 0x00
page1[0]=0x0;
page1[1]=0x0;

//第二頁的開始位置在 0x40
page2[0]=0x0;
page2[1]=0x40;


while(1)
{
if(start)
{
start=0;
/* //發送  send  第一頁到EEPROM
R_PG_I2C_MasterSend_C0(0xa0,page1,64);   //62 個 data
while(f_IICTX);
f_IICTX=1;
for(k=0;k<88888;k++); //delay
//發送  send 第二頁到EERPOM
R_PG_I2C_MasterSend_C0(0xa0,page2,64);   //62 個 data
while(f_IICTX);
f_IICTX=1;
for(k=0;k<88888;k++); //delay
*/
//接收   receive  接收前要先送位置 這邊送 0x00直接送最開始讀到最後
R_PG_I2C_MasterSend_C0(0xa0,address,2);
while(f_IICTX);
f_IICTX=1;
for(k=0;k<88888;k++); //delay
R_PG_I2C_MasterReceive_C0(0xa1,rx,128);  //直接接收128個放到RX矩陣
while(f_IICRX);
f_IICRX=1;
for(k=0;k<88888;k++); //delay
}

        //關燈 防止殘影
R_PG_IO_PORT_Write_P7(0xff);
R_PG_IO_PORT_Write_P7(~rx[i]);  //0 2 4 6 8
if(rx[i]==0x80) //0x80是小數點 
R_PG_IO_PORT_Write_PB0(0);
else
R_PG_IO_PORT_Write_PB0(1);
//Chanal
        R_PG_IO_PORT_Write_P9(rx[i+1]);   // 1 3 5 7



//如果矩陣跑到最大那就從頭
if(i==128)
i=0;


}//whle



}//end

//Rx中斷
IIC0MasterReFunc()
{
f_IICRX=0;
}

//Tx中斷
IIC0MasterTrFunc()
{
f_IICTX=0;
}

//Timer 每0.25秒進入一次
Cmt0IntFunc()
{
i+=2;
}







1 則留言:

  1. 有沒有Rx62t的I²C 對 紅外線感測器 傳輸 的範例

    回覆刪除