Esempio n. 1
0
bool I2CTest::execute_class_performance_case(){
    bool result = true;
    I2CPinAssignment pin_assignment;
    Thread uno_thread(1024);
    result = true;
    I2C i2c_slave(0);
        thread_running = 1;
        pin_assignment->scl = mcu_pin(i2c1_scl_port,i2c1_scl_pin);
        pin_assignment->sda = mcu_pin(i2c1_sda_port,i2c1_sda_pin);
        i2c_slave.init(I2C::FLAG_SET_MASTER, 100000, pin_assignment);
        i2c_slave.prepare(slave_address_8,I2C_FLAG_PREPARE_DATA); //prepare for data only transactions
        i2c_slave.write(&data, sizeof(data)); //write two bytes

        i2c_slave.close();


    return result;
}
/**********************************************************************
functionName:uint8_t i2c_wait_ack(void) 
description:I2C等待应答
**********************************************************************/
uint8_t i2c_wait_ack(void) 
{
	uint16_t errtime=2555;//因故障接收方无ACK,超时值为255。 
	i2c_slave();	
	bsp_DelayUS(I2C_DELAY);
	SET_SCL;
	bsp_DelayUS(I2C_DELAY);
	while(STU_I2C_SDA)
	{
		errtime--;
		if (!errtime)
		{
			i2_stop();
			return 0x00;
		}
	}
	CLR_SCL;
	i2c_mastar();
	return 0xff;
}
/**********************************************************************
functionName:uint8_t i2c_recv_byte(void)
description:I2C接受字节
**********************************************************************/
uint8_t i2c_recv_byte(void)
{
	uint8_t i=8;
	uint8_t ddata=0; 
	
	i2c_slave();	 
	while (i--)
	{
		ddata<<=1;
		CLR_SCL;
		bsp_DelayUS(I2C_DELAY);
		SET_SCL;
		bsp_DelayUS(I2C_DELAY);
		if(STU_I2C_SDA)
		ddata|=0x01;
	}
	CLR_SCL;
	i2c_mastar(); 
	return ddata;
}
Esempio n. 4
0
bool I2CTest::execute_class_api_case(){
    bool result = true;
    get_i2c_count();
    print_case_message("Board has %d I2C", m_i2c_count);
    I2CAttr i2c_attr;
    i2c_attr.set_slave_addr(2);
    mcu_pin_t i2c1_scl;
    mcu_pin_t i2c1_sda;
    mcu_pin_t i2c2_scl;
    mcu_pin_t i2c2_sda;
    mcu_pin_t temp_pin;

    u16 slave_address_16 = 0x4c4c;
    i2c1_scl.port = i2c1_scl_port;
    i2c1_scl.pin = i2c1_scl_pin;
    i2c1_sda.port = i2c1_sda_port;
    i2c1_sda.pin = i2c1_sda_pin;
    i2c2_scl.port = i2c2_scl_port;
    i2c2_scl.pin = i2c2_scl_pin;
    i2c2_sda.port = i2c2_sda_port ;
    i2c2_sda.pin = i2c2_sda_pin;
    i2c_attr.set_scl(i2c2_scl);
    temp_pin = i2c_attr.scl();
    if(temp_pin.port!=i2c2_scl.port || temp_pin.pin!=i2c2_scl.pin){
        print_case_message("Failed %s %d:", __FILE__, __LINE__);
        result = false;
    }
    i2c_attr.set_sda(i2c2_sda);
    temp_pin = i2c_attr.sda();
    if(temp_pin.port!=i2c2_sda.port || temp_pin.pin!=i2c2_sda.pin){
        print_case_message("Failed %s %d:", __FILE__, __LINE__);
        result = false;
    }
    i2c_attr.set_slave_addr(slave_address_8);
    if(i2c_attr.slave_addr()!=slave_address_8){
        print_case_message("Failed %s %d:", __FILE__, __LINE__);
        result = false;
    }
    i2c_attr.set_slave_addr16(slave_address_16);
    if(i2c_attr.slave_addr16() !=slave_address_16){
        print_case_message("Failed %s %d:", __FILE__, __LINE__);
        result = false;
    }

    for(I2C::port_t count = 0; count < m_i2c_count; count++){
        I2C i2c(count);
        if( execute_i2c_api_case(i2c) == false ){
            result = false;
        }
    }

    I2C i2c_master(0);
    I2C i2c_slave(1);
    if( i2c_master.open(I2C::RDWR|I2C::NONBLOCK) < 0 ){
        print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
        result = false;
    } else {
        if(i2c_slave.open(I2C::RDWR|I2C::NONBLOCK)){
            print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
            result = false;
        }else{
            i2c_attr.set_scl(i2c1_scl);
            i2c_attr.set_sda(i2c1_sda);
            i2c_attr.set_flags(I2C_FLAG_SET_MASTER);
            i2c_attr.set_freq(100000);
				if(i2c_master.set_attributes(i2c_attr)!=0){
                print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
                result = false;
            }
            i2c_attr.set_flags(I2C_FLAG_SET_SLAVE);
            i2c_attr.set_freq(100000);
            i2c_attr.set_scl(i2c2_scl);
            i2c_attr.set_sda(i2c2_sda);
            i2c_attr.set_slave_addr(slave_address_8);
				if(i2c_slave.set_attributes(i2c_attr)){
                print_case_message("Failed %s %d", __FILE__, __LINE__);
                result = false;
            }
            char recv_buff[sizeof(data)];
            Aio aio_r(recv_buff, sizeof(data)); //aio uses buf as it's data
            Aio aio_t(&data, sizeof(data)); //aio uses buf as it's data
            i2c_slave.read(aio_r);
            i2c_master.prepare(slave_address_8, I2C::FLAG_PREPARE_DATA);
            i2c_master.write(aio_t);
            while( !aio_r.is_done()){
                Timer::wait_msec(5); //wait for the operation to complete
            }
            while( !aio_t.is_done()){
                Timer::wait_msec(5); //wait for the operation to complete
            }
            if(memcmp(&data,recv_buff,sizeof(data))){
                print_case_message("Failed %s %d:", __FILE__, __LINE__);
                print_case_message("recv %s ", recv_buff);
                result = false;
            }
            if( i2c_slave.close() < 0 ){
                print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
                result = false;
            }

        }
        if( i2c_master.close() < 0 ){
            print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
            result = false;
        }
    }

/*    if( i2c_master.open(I2C::RDWR|I2C::NONBLOCK) < 0 ){
        print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
        result = false;
    } else {
        i2c_slave.open(I2C::RDWR|I2C::NONBLOCK);

        i2c_attr.set_scl(i2c2_scl);
        i2c_attr.set_sda(i2c2_sda);
        i2c_attr.set_slave_addr(slave_address_8);
        i2c_attr.set_flags(I2C_FLAG_SET_MASTER);
        i2c_attr.set_freq(100000);

        i2c_master.set_attr(i2c_attr);
        i2c_attr.set_flags(I2C_FLAG_SET_SLAVE);
        i2c_attr.set_freq(100000);
        i2c_attr.set_scl(i2c3_scl);
        i2c_attr.set_sda(i2c3_sda);
        i2c_attr.set_slave_addr(slave_address_8);
        i2c_slave.set_attr(i2c_attr);
            //char text[] = "hello_two";
        char messege_text[] = "i2c_test";
        char recv_buff[sizeof(messege_text)];
        while(1){
            i2c_master.write(messege_text,2);
			Timer::wait_milliseconds(50); //wait for the operation to complete
        }
        Aio aio_r(recv_buff, sizeof(messege_text)); //aio uses buf as it's data
        Aio aio_t(messege_text, sizeof(messege_text)); //aio uses buf as it's data
        i2c_slave.read(aio_r);
        i2c_master.prepare(slave_address_8, I2C::FLAG_PREPARE_DATA);
        i2c_master.write(aio_t);

        while( !aio_r.is_done()){
			Timer::wait_milliseconds(5); //wait for the operation to complete
        }
        while( !aio_t.is_done()){
			Timer::wait_milliseconds(5); //wait for the operation to complete
        }
        if(memcmp(messege_text,recv_buff,sizeof(messege_text))){
            print_case_message("Failed %s %d:", __FILE__, __LINE__);
            print_case_message("recv %s ", recv_buff);
            result = false;
        }
        Timer::wait_milliseconds(100);
        if( i2c_master.close() < 0 ){
            print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
            result = false;
        }
        if( i2c_slave.close() < 0 ){
            print_case_message("Failed %s %d: port:%d", __FILE__, __LINE__, i2c_master.port());
            result = false;
        }

    }*/

    return result;
}
Esempio n. 5
0
bool I2CTest::execute_class_stress_case(){
    bool result = true;

    I2CPinAssignment pin_assignment;
    Thread uno_thread(1024);
    i2c_attr_t i2c_attr_s;
    mcu_pin_t i2c1_scl,i2c1_sda;
    result = true;
    u16 answer[] = {0xf1f1,0xf1f1,0xf1f1,0xf1f1};
    u16 write_data[] = {0x0001,0x0003,0x0007,0x000f};
    i2c1_scl.port = i2c1_scl_port;
    i2c1_scl.pin = i2c1_scl_pin;
    i2c1_sda.port = i2c1_sda_port ;
    i2c1_sda.pin = i2c1_sda_pin;

    i2c_attr_s.pin_assignment.scl = i2c1_scl;
    i2c_attr_s.pin_assignment.sda = i2c1_sda;
    i2c_attr_s.freq = 100000;
    i2c_attr_s.o_flags = I2C_FLAG_SET_SLAVE;
    i2c_attr_s.slave_addr[0].addr8[0] = slave_address_8;
    i2c_attr_s.data = &answer;
    i2c_attr_s.size = sizeof(answer);
    I2C i2c_master(1);
    I2C i2c_slave(0);
    if( i2c_slave.open() != 0 ){
        result = false;
    } else {
		  if(i2c_slave.set_attributes(i2c_attr_s)){
            result = false;
        }
        i2c_info_t i2c_info;
        i2c_slave.get_info(i2c_info);
        printf("slave freq - %lu,flag - %lu",i2c_info.freq,i2c_info.o_flags);

        thread_running = 1;
        pin_assignment->scl = mcu_pin(i2c2_scl_port,i2c2_scl_pin);
        pin_assignment->sda = mcu_pin(i2c2_sda_port,i2c2_sda_pin);
        u16 recv_data[4];
        u8 recv;
        int loc = 0;
        memset(recv_data,0,sizeof(answer));
        i2c_master.init(I2C::FLAG_SET_MASTER, 100000, pin_assignment);
        i2c_master.get_info(i2c_info);
        print_case_message("master freq - %lu,flag - %lu",i2c_info.freq,i2c_info.o_flags);
        //i2c_master.prepare(slave_address_8,I2C_FLAG_PREPARE_DATA); //prepare for data only transactions
//        i2c_master.write(&data, sizeof(data)); //write two bytes
       // i2c_master.read(&recv_data,sizeof(data)); //read two bytes

        i2c_master.prepare(slave_address_8,I2C::FLAG_PREPARE_PTR_DATA); //prepare for data only transactions
        //i2c_slave.prepare(slave_address_8,I2C::FLAG_PREPARE_PTR_DATA); //prepare for data only transactions
/*        i2c_master.read(loc, recv); //write two bytes
        i2c_master.read(loc, recv); //write two bytes
        i2c_master.read(loc, recv); //write two bytes
        i2c_master.read(loc, recv); //write two bytes*/
        //i2c_master.prepare(slave_address_8,I2C_FLAG_PREPARE_DATA); //prepare for data only transactions
        //i2c_master.write(loc,0x00);

        i2c_master.read(loc, recv); //write two bytes
        //loc++;
        //i2c_master.read(loc, recv); //write two bytes
        //i2c_master.read(recv_data,sizeof(answer)); //read two bytes
        print_case_message("data read %u %u %u %u %u",recv_data[0],recv_data[1],recv_data[2],recv_data[3],recv);
        print_case_message("data write %u %u %u %u",answer[0],answer[1],answer[2],answer[3]);
        i2c_master.close();
        i2c_slave.close();
    }
    return result;
}
Esempio n. 6
0
/*-----------------------------------------------------------------------------
*  program start
*/
int main(void) {                      

    int     sioHandle;
    uint8_t i;
    uint8_t u8;

    MCUSR = 0;
    wdt_disable();

    /* get module address from EEPROM */
    sMyAddr = eeprom_read_byte((const uint8_t *)MODUL_ADDRESS);
    for (i = 0; i < NUM_BUTTON_EVENT_ADDRESSES; i++) {
        sMySwitchAddr[i] = eeprom_read_byte((const uint8_t *)(BUTTON_EVENT_ADRESS_BASE + i));
    }
   
    PortInit();
    TimerInit();
    SioInit();
    SioRandSeed(MY_ADDR);
    sioHandle = SioOpen("USART0", eSioBaud9600, eSioDataBits8, eSioParityNo, 
                        eSioStopBits1, eSioModeHalfDuplex);
    SioSetIdleFunc(sioHandle, IdleSio);
    SioSetTransceiverPowerDownFunc(sioHandle, BusTransceiverPowerDown);

    BusTransceiverPowerDown(true);
   
    BusInit(sioHandle);
    spRxBusMsg = BusMsgBufGet();

    /* enable global interrupts */
    ENABLE_INT;  
    i2c_slave(SLAVE_ADRESSE);

    button_register = 0;

    init_BJ(SLAVE_ADRESSE);

    for (i = 0; i < NR_OF_LEDS; i++) {
        u8 = eeprom_read_byte((const uint8_t *)(COLOR_LED_BASE + i));
        set_LED(i, u8);
        sNewLedData[i / 2] |= (u8 & 0x0f) << ((i % 2) ? 4 : 0);
    }

    i2c_slave(SLAVE_ADRESSE);

    SendStartupMsg();
   
    while (1) { 
        Idle();
        if (send_startup == 1) {
            init_BJ(SLAVE_ADRESSE);
            for (i = 0; i < NR_OF_LEDS; i++) {
                set_LED(i, eeprom_read_byte((const uint8_t *)(COLOR_LED_BASE + i)));
            }
        }
        sInputState = button_register; 
        ProcessButton(sInputState);

        ProcessBus();

        for (i = 0; i < BUS_SW16_LED_SIZE_SET_VALUE; i++) {
            if ((sNewLedData[i] & 0x0f) != (sLedData[i] & 0x0f) ) { // linke LED
                set_LED(i * 2, sNewLedData[i] & 0x0f);
                i2c_slave(SLAVE_ADRESSE);
            }
            if ((sNewLedData[i] & 0xf0) != (sLedData[i] & 0xf0) ) { // rechte LED
                set_LED(i * 2 + 1, (sNewLedData[i] & 0xf0) >> 4);
                i2c_slave(SLAVE_ADRESSE);
            }
            sLedData[i] = sNewLedData[i];
        }
    }