請教各位CH452的幾個問題~

請教各位幾個問題~ 1. 是否支持硬件SPI(非IO口線模擬) (主要是對SPCK,MISO,MOSI的兼容.) 看過論壇的幾個帖~有的說可以,有的說不可以.希望斑竹能給個明確的答復. 留個貴公司的技術(shù)支持號碼也行~

2. 是否支持硬件I2C(非IO口線模擬) 我只需要接一片CH452就可以了..是不是可以和MCU的硬件I2C進行2線相連?

2. 抗干擾的問題. 發(fā)現(xiàn)很多使用452的朋友都遇到了各種干擾的問題,是不是這個芯片本身對環(huán)境要求比較高?

謝謝您的回復: )

1.不支持硬件SPI,但部分時序兼容SPI時序. 2.支持硬件I2C 3.只要電源線和地線的PCB布線合理,CH452的抗干擾能力較好 公司主頁上有聯(lián)系電話


感性您的回答

還有點不明白 部分兼容SPI時序是什么意思~必須用IO模擬這種類似SPI的時序么?? 現(xiàn)在只要需要MOSI MISO SPCK 能直接連接就可以了, 片選可以用IO控制.主要是不能占用CPU的時間來操作IO, 想直接叫給SPI外設(shè)數(shù)據(jù)就完事了~不然每次發(fā)送接受都要CPU來介入底層的時鐘等操作會占時間~

能解答下嗎?? : )


部分兼容SPI時序是指CH452四線制的時序部分與SPI的時序一致.


是部分支持硬件SPI時序的,但是并不是簡單的發(fā)送數(shù)據(jù),如果需要硬件SPI操作452的話,這個是AVR的例子程序: 這是一個硬件SPI和451相連接的例子程序,你可以參考,單片機是AVR的MEGA8: //ICC-AVR application builder : 2006-8-7 8:52:40 // Target : M8 // Crystal: 11.059Mhz #include #include #include #include #include #define CH452_SDA_SET PORTC|=(1<#define CH452_SDA_CLR PORTC&=~(1<#define CH452_SCL_SET PORTC|=(1<#define CH452_SCL_CLR PORTC&=~(1<#define DELAY_1US {mDelay1uS( );} #define CH452_SDA_IN ((PINC&0X10)!=0) #define CH452_WIRE ( PIND&0X04 ) void mDelay1uS( ) /* 至少延時1uS,根據(jù)單片機主頻調(diào)整 */ { unsigned char i; for ( i = 10; i != 0; i -- ); }

void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

void init_CH452_IO() { PORTC|=0X30; DDRC|=0X30; // DDRD|=0XF7; }

void CH452_I2c_Start() { #ifdef USE_KEY DISABLE_INTERRUPT; //禁止鍵盤中斷,防止開始時被CH452中斷而進入中斷服務(wù)程序中的START #endif CH452_SDA_SET; /*發(fā)送起始條件的數(shù)據(jù)信號*/ CH452_SCL_SET; mDelay1uS(); CH452_SDA_CLR; /*發(fā)送起始信號*/ mDelay1uS(); CH452_SCL_CLR; /*鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) */ mDelay1uS(); } void CH452_I2c_Stop() { CH452_SDA_CLR; mDelay1uS(); CH452_SCL_SET; mDelay1uS(); CH452_SDA_SET; /*發(fā)送I2C總線結(jié)束信號*/ mDelay1uS(); #ifdef USE_KEY ENABLE_INTERRUPT; #endif } void CH452_I2c_WrByte(unsigned char c) //寫一個字節(jié)數(shù)據(jù) { unsigned char i; for(i=0;i!=8;i++) // 輸出8位數(shù)據(jù) { if(c&0x80) {CH452_SDA_SET;} else {CH452_SDA_CLR;} CH452_SCL_SET; c<<=1; mDelay1uS(); mDelay1uS(); CH452_SCL_CLR; mDelay1uS(); // DELAY_1US; } mDelay1uS(); CH452_SDA_SET; CH452_SCL_SET; // 接收應(yīng)答 mDelay1uS(); mDelay1uS(); CH452_SCL_CLR; mDelay1uS(); } unsigned char CH452_I2c_RdByte() //讀一個字節(jié)數(shù)據(jù) { unsigned char c,i; c=0; for(i=0;i!=8;i++) // 輸入8位數(shù)據(jù) { CH452_SDA_SET; CH452_SCL_SET; //////////////////////////// PORTC|=(1<DDRC&=~(1<//////////////////////////// mDelay1uS(); mDelay1uS(); c<<=1; if(CH452_SDA_IN) c|=0x01; // 輸入1位 /////////////////////////// DDRC|=(1</////////////////////////// CH452_SCL_CLR; mDelay1uS(); // DELAY_1US; } mDelay1uS(); CH452_SDA_SET; CH452_SCL_SET; // 發(fā)出無效應(yīng)答 mDelay1uS(); mDelay1uS(); CH452_SCL_CLR; mDelay1uS(); return(c); } void CH452_Write(unsigned int command) //寫命令 { CH452_I2c_Start(); /*啟動總線*/ #ifdef ENABLE_2_CH452 // 若有兩個CH452并連 CH452_I2c_WrByte(((unsigned char)(command>>7)&0x3E)|0x40); // CH452的ADDR=0時 #else CH452_I2c_WrByte(((unsigned char)(command>>7)&0x3E)|0x60); // CH452的ADDR=1時(默認) #endif CH452_I2c_WrByte((unsigned char)command); /*發(fā)送數(shù)據(jù)*/ CH452_I2c_Stop(); /*結(jié)束總線*/ }

void port_init(void) { PORTB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; }

void spi_init(){ DDRB |= 0x2c;//SCK-OUT,MISO-IN,MOSI-OUT,SS-OUT DDRD &=0XFB;//PD2-IN,鍵盤中斷引腳 SPCR = 0x73;//SPE=1,DORD=1(LSB FIRSET),MSTR=1,CPOL=CPOH=0,SPR0=SPR1=1 } void spi_send(unsigned short cData) { PORTB &=0xfb;//cs=0 mDelay1uS(); mDelay1uS(); cData =cData<<4; SPDR = cData&0xff; /* 等待傳輸結(jié)束 */ while(!(SPSR & (1< SPDR = (unsigned char)(cData>>8);; /* 等待傳輸結(jié)束 */ while(!(SPSR & (1< PORTB |=0x04;//cs=1 mDelay1uS(); mDelay1uS(); mDelay1uS(); mDelay1uS(); mDelay1uS(); mDelay1uS(); }

unsigned char spi_rec(void ) { unsigned char key,c; DDRB |= 0x2c;//SCK-OUT,MISO-IN,MOSI-OUT,SS-OUT SPCR = 0x53;//SPE=1,DORD=0(MSB FIRSET),MSTR=1,CPOL=CPOH=0,SPR0=SPR1=1 PORTB &=0xfb;//cs=0 mDelay1uS(); mDelay1uS(); SPDR = 0x0E; /* 等待傳輸結(jié)束 */ while(!(SPSR & (1< mDelay1uS(); mDelay1uS(); PORTB |=0x04;//cs=1 CH452_Write(0x0800|0X03); mDelay1uS(); mDelay1uS(); SPDR = 0x00;//接收數(shù)據(jù) /* 等待傳輸結(jié)束 */ while(!(SPSR & (1< mDelay1uS(); mDelay1uS(); key=SPDR; key=key>>1; DDRB |= 0x2c;//SCK-OUT,MISO-IN,MOSI-OUT,SS-OUT SPCR = 0x73;//SPE=1,DORD=1(LSB FIRSET),MSTR=1,CPOL=CPOH=0,SPR0=SPR1=1 mDelay1uS(); mDelay1uS(); mDelay1uS(); mDelay1uS(); return key; } void main(void){ unsigned int i=0; Delay50ms( ); Delay50ms( ); Delay50ms( ); Delay50ms( ); Delay50ms( ); Delay50ms( ); Delay50ms( ); port_init( ); init_CH452_IO(); CH452_Write(0X0401); CH452_Write(0x058C); spi_init( ); //初始化 spi_send(0x403); Delay50ms( ); spi_send(0x058C); Delay50ms( ); spi_send(0x800|0x01); Delay50ms( ); spi_send(0xc00|0x02); Delay50ms( ); spi_send(0xd00|0x05); CH452_Write(0x0900|0X07); while(1){ spi_send(0x403); Delay50ms( ); spi_send(0x058C); Delay50ms( ); CH452_Write(0x0800|0X01); if(CH452_WIRE==0){ //鍵盤,查詢方式 spi_send(0XA00|spi_rec()&0x0f); CH452_Write(0x0a00|spi_rec()&0x0f); spi_send(0XB00|(spi_rec()&0xf0)>>4); CH452_Write(0x0900|(spi_rec()&0xf0)>>4); } } }


還需要聲明下的就是中間有些延時可以根據(jù)主頻來調(diào)整,還有就是當有按鍵的時候,INT#(按鍵中斷腳)要和SPI的輸入引腳相連接


暈.. 你那個程序我在別的帖里看到過.. 里面還有些I2c的子程序是什么東東.. 我用的是4線的..!


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频