请教各位CH452的几个问题~

请教各位几个问题~ 1. 是否支持硬件SPI(非IO口线模拟) (主要是对SPCK,MISO,MOSI的兼容.) 看过论坛的几个帖~有的说可以,有的说不可以.希望斑竹能给个明确的答复. 留个贵公司的技术支持号码也行~

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

2. 抗干扰的问题. 发现很多使用452的朋友都遇到了各种干扰的问题,是不是这个芯片本身对环境要求比较高?

谢谢您的回复: )

1.不支持硬件SPI,但部分时序兼容SPI时序. 2.支持硬件I2C 3.只要电源线和地线的PCB布线合理,CH452的抗干扰能力较好 公司主页上有联系电话


感性您的回答

还有点不明白 部分兼容SPI时序是什么意思~必须用IO模拟这种类似SPI的时序么?? 现在只要需要MOSI MISO SPCK 能直接连接就可以了, 片选可以用IO控制.主要是不能占用CPU的时间来操作IO, 想直接叫给SPI外设数据就完事了~不然每次发送接受都要CPU来介入底层的时钟等操作会占时间~

能解答下吗?? : )


部分兼容SPI时序是指CH452四线制的时序部分与SPI的时序一致.


是部分支持硬件SPI时序的,但是并不是简单的发送数据,如果需要硬件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,根据单片机主频调整 */ { 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中断而进入中断服务程序中的START #endif CH452_SDA_SET; /*发送起始条件的数据信号*/ CH452_SCL_SET; mDelay1uS(); CH452_SDA_CLR; /*发送起始信号*/ mDelay1uS(); CH452_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */ mDelay1uS(); } void CH452_I2c_Stop() { CH452_SDA_CLR; mDelay1uS(); CH452_SCL_SET; mDelay1uS(); CH452_SDA_SET; /*发送I2C总线结束信号*/ mDelay1uS(); #ifdef USE_KEY ENABLE_INTERRUPT; #endif } void CH452_I2c_WrByte(unsigned char c) //写一个字节数据 { unsigned char i; for(i=0;i!=8;i++) // 输出8位数据 { 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; // 接收应答 mDelay1uS(); mDelay1uS(); CH452_SCL_CLR; mDelay1uS(); } unsigned char CH452_I2c_RdByte() //读一个字节数据 { unsigned char c,i; c=0; for(i=0;i!=8;i++) // 输入8位数据 { 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; // 发出无效应答 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); /*发送数据*/ CH452_I2c_Stop(); /*结束总线*/ }

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; /* 等待传输结束 */ while(!(SPSR & (1< SPDR = (unsigned char)(cData>>8);; /* 等待传输结束 */ 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; /* 等待传输结束 */ while(!(SPSR & (1< mDelay1uS(); mDelay1uS(); PORTB |=0x04;//cs=1 CH452_Write(0x0800|0X03); mDelay1uS(); mDelay1uS(); SPDR = 0x00;//接收数据 /* 等待传输结束 */ 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); } } }


还需要声明下的就是中间有些延时可以根据主频来调整,还有就是当有按键的时候,INT#(按键中断脚)要和SPI的输入引脚相连接


晕.. 你那个程序我在别的帖里看到过.. 里面还有些I2c的子程序是什么东东.. 我用的是4线的..!


只有登录才能回复,可以选择微信账号登录